Javascript核心之原型链

前置知识

JavaScript中一切皆对象es6

  1. 除了undefined以外全部的数据类型都是对象(引用类型)或者有其对应的包装类(原始类型)。函数

    • 原始值(不可变)this

      • undefined
      • null
      • Boolean
      • Number
      • String
      • Symbol (es6新增)
      • BigInt (es6新增)
    • 引用类型spa

      • Object
      • Array
      • Function
      • RegExp
      • Date
      • Promise (es6新增)
      • Map (es6新增)
      • Set (es6新增)
      • WeakSet (es6新增)
      • WeakMap (es6新增)
      • ...
//null也是对象
typeof null //"object"
  1. 全部对象都有其对应的构造函数,null除外。

能够理解为全部对象都是由函数产生的,均可以使用new关键字建立,函数也是一个对象,由Function产生。prototype

var num = new Number(); //数字
var str = new String(); //字符串
var bool = new Boolean(); //布尔值

var obj = new Object(); //空对象
//定义一个函数
function sum(a, b){
    return a + b;
}

//至关于下面的写法
var sum = new Function("a", "b", "return a + b");
//自定义构造函数
function Person(name, age){
    this.name = name;
    this.age = age;
}
var person = new Person('wlicox', 18); //自定义对象

new一个对象的时候JS作了哪些事情

  1. 隐式的建立一个this对象;
  2. this对象中包括一个prototype属性,指向该构造函数的原型;
  3. prototype对象中包括一个construtor属性,指向该构造函数自己;
  4. 返回this

用代码解释大概就是下面这样的:code

假设有一个自定义构造函数Person对象

function Person(name, age){
    this.name = name;
    this.age = age;
}

当执行var person = new Person('wlicox', 18)blog

function Person(name, age){
    //1.隐式的建立一个this对象
    var this = {
        //2.有一个prototype属性
        prototype: {
            construtor: Foo //3.指回Foo本身
        }
    };
    
     /*用户代码*/
    this.name = name;
    this.age = age;
    
    return this; //4.隐式的返回this
}

构造函数和普通函数的区别

  1. 构造函数只作一件事,就是建立对象,普通函数能够提升编写的效率以及代码的复用等;
  2. 构造函数的命名使用大驼峰,普通函数的命名使用小驼峰;
  3. 构造函数的入参是做为建立对象的属性的值,普通对象的入参是用来提升函数的灵活性的;
  4. 构造函数使用new关键字调用,普通函数使用()调用;
  5. 构造函数不能有返回值,若是显式的返回一个引用类型的值,那么经过new建立的对象就一直是该返回值(返回原始类型的值不影响结果),普通函数有没有返回值均可以。
function Person(name, age){
    this.name = name;
    this.age = age;
    return {};
}

var person = new Person('wilcox', 18)
console.log(person) //{}

原型prototype

  1. 原型实际上就是一个普通的对象,每一个构造函数建立的时候都有个本身的原型;
  2. 构造函数经过prototype属性找到它的原型;
  3. 构造函数建立的对象会继承其构造函数原型上对象上的属性。

构造函数construtor

  1. 原型对象中的属性,指向该构造函数自己;
Person === Person.prototype.constructor //true

隐式原型__proto__

  1. 用构造函数生成的对象可使用__proto__属性找到其构造函数的原型;
person.__proto__ === Person.prototype //true

prototypeconstrutor__proto__三者的关系

image.png

原型链

  1. 每一个对象都有__proto__属性,由__proto__属性串联起来的的对象的集合就是原型链外;
  2. 当一个对象在本身身上找不到属性时,就会顺着原型链往上找;

image.png

  1. Object的原型是最顶端的原型,其中有一个toSting方法,这也就是为何全部的数据类型都自带toString方法。
  2. null没有原型
  3. 原型图:

image.png

注意:由于对象都是由构造函数参数的因此 Function 是一开始就存在的,再js代码执行的时候, Function就被放入到内存中, Function也是对象,但它没有构造函数,因此它的 __proto__指向它的本身的原型。
相关文章
相关标签/搜索