美文网首页
原型和原型链

原型和原型链

作者: i5yue | 来源:发表于2019-04-16 23:26 被阅读0次

    原型和原型链

    原型的特性
    • 所有的引用类型(数组、对象、函数),都对象特性,即可自由扩展属性(除了“null”意外)
    • 所有的引用类型(数组、对象、函数),都有一个_proto_(隐式原型)属性,属性值是一个普通的对象
    • 所有的函数,都有一个prototype属性,属性值也是一个普通的函数
    • 所有的引用类型(数组、对象、函数),_proto_属性值指向它的构造函数的 prototype(显性属性)属性值
    • 每一个原型对象都有一个constructor属性指向关联的构造函数;
    • 原型链的链接依赖proto这个指针,每一级的原型对象都依靠这个指针指向上一级原型对象;
    • 原型链的尽头始终是null;
    • 原型对象充当两面派,既是构造函数函数,也是对象;
    function Foo() {
    
    }
    
    const obj = new Foo();
    
    console.log(Foo.prototype === obj.__proto__);
    console.log(obj.constructor === Foo);
    console.log(Foo.prototype.__proto__ === Object.prototype);
    console.log(Object.prototype.__proto__ === null);
    console.log(Object.constructor === Function);
    
    true true true true true
    
    原型链的形成

    每个对象拥有一个原型对象,通过 _proto_ 指针指向上一个原型 ,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null,这种关系被称为原型链

    原型链图片.jpg
    • [图片上传失败...(image-e66217-1555428386290)]
    instanceof 运算符

    instanceof运算符返回一个布尔值,表示对象是否为某个构造函数的实例。 原理就是一层一层查找 _proto_,如果和 constructor.prototype 相等则返回 true,如果一直没有查找成功则返回 false。

    构造函数、原型和实例之间的关系

    每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个原型对象的指针。

    原型铁三角关系.png

    (1)实例对象由构造函数new产生;
    (2)构造函数的原型属性与实例对象的原型对象均指向原型
    (3)原型对象中有一个属性constructor指向对应的构造函数

    相关文章

      网友评论

          本文标题:原型和原型链

          本文链接:https://www.haomeiwen.com/subject/vmswwqtx.html