原型链

原型与原型层层相链接的过程即为原型链
对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有proto原型的存在每个对象都有proto原型的存在
原型链-回顾篇(三) - 图1

原型规则

  • 所有引用类型,都具有对象特性,可只有拓展属性, null除外
  • 所有的引用类型,都有一个proto属性, 属性值是普通对象,隐式原型
  • 所有的函数都有prototype属性,属性值也是普通对象,(箭头函数除外,没有 prototype 属性,即指向 undefined)
  • 所有的引用类型值的隐式类型指向它构造函数的显示属性值
  • 当得到对象的某个属性时候,如果这个对象本身没有这个属性,会到它的proto里面去找,相当于,去构造函数的显式原型里面去找

    构造函数例子

    function Foo(name, age) {
    this.name = name
    this.age = age
    this.class = ‘class-1’
    // return this 默认有
    }
    var f = new Foo(‘wangmo’, 20)
    function Father(name) {
    this.name = name;
    }
    let son = new Father(‘Lisa’);
    console.log(son); //Father {name: “Lisa”}
    function Star(name) {
    this.name = name;
    }
    let obj = new Star(‘小红’);
    console.log(Star.prototype.constructor === Star);//true
    console.log(obj.proto.constructor === Star); //true
    原型的构造器指向的是构造函数

    原型的构造器

    再试着判断f instanceof Object
    f的proto一层一层往上找,看看能否对应到foo的prototype

    intanceof执行逻辑

  • 创建了一个空对象son{}

  • 为son准备了一个原型连接, son.proto === fater.prototype
  • 重新绑定this,使构造函数的this,指向新对象Father.call(this)
  • 为新对象赋值
  • 返回this

    new 一个对象的过程中,发生了什么

    1. function Father(name) {
    2. this.name = name;
    3. }
    4. let son = new Father('Lisa');
    5. console.log(son); //Father {name: "Lisa"}
  • 创建了一个空对象son{}
  • 为son准备了一个原型连接, son.proto === fater.prototype
  • 重新绑定this,使构造函数的this,指向新对象Father.call(this)
  • 为新对象赋值
  • 返回this

    intanceof执行逻辑

    f的proto一层一层往上找,看看能否对应到foo的prototype
    再试着判断f instanceof Object

    原型的构造器

    原型的构造器指向的是构造函数
    1. function Star(name) {
    2. this.name = name;
    3. }
    4. let obj = new Star('小红');
    5. console.log(Star.prototype.constructor === Star);//true
    6. console.log(obj.__proto__.constructor === Star); //true