继承与原型链

86 阅读1分钟

数据类型

  • 原始类型(值存于栈)
    • string
    • number
    • boolean
    • bigint
    • null
    • undefined
    • symbol
  • 对象(值存于堆,指向值的引用存于栈)

prototype

  • 函数特有的属性
  • 一个函数的 prototype 上所有的属性和方法都可以让其所构建的所有实例通过原型链访问

[[Prototype]]

  • 等同于 JavaScript 非标准但许多浏览器实现了的 __proto__

  • 可通过 Object.getPrototypeOfObject.setPrototypeOf 访问

  • 每个实例对象都有一个私有属性 [[Prototype]] 指向它的构造函数的原型对象 prototype,而该原型对象也有自己的原型对象 [[Prototype]],层层向上直到一个对象的原型对象为 null,而 null 是没有原型的,所以原型链的终点就是 null

    function A(){}
    const oA = new A();
    
    # 原型链
    oA.__proto__ === A.prototype;
    A.prototype.__proto__ === Object.prototype;
    Object.prototype.__proto__ === null;
    

Function

  • 每个函数都是由 Function 构造的实例对象
  • Function[[Prototype]]prototype 都指向一个匿名函数,而该匿名函数的 [[Prototype]] 则指向 Object.prototype
  • Functionconstructor 则指向自身

constructor

  • 每个实例对象都有一个私有属性 constructor 指向它的构造函数

  • 而构造函数本身也是由 Function 构造的实例对象,故构造函数的 constructor 则指向 Function

    function A(){}
    const oA = new A();
    
    oA.constructor === A;
    A === A.prototype.constructor;
    A.constructor = Function;
    Function === Function.constructor;
    Function.constructor === Function.prototype.constructor;
    

常用方法

  • prototypeObj.isPrototypeOf(object):
    • Object.prototype.isPrototypeOf 继承而来
    • 判断 prototypeObj 是否在 object 的原型链上
  • object instanceof constructor:判断 constructor.prototype 是否在 object 的原型链上
  • Object.create
  • obj.hasOwnProperty(prop):
    • Object.prototype.hasOwnProperty 继承而来
    • 判断 prop 是否为 obj 的自身属性,不包含原型链上的。

References