js 原型链之我见

前言

  • 原型链初步
    一个对象a会有一个__proto__属性指向另一个对象b, 当然, 如果这个对象b不为null, 那么它还会指向另一个对象c, 如此一来就形成了一条"原型链".
a.__proto__ => b, b.__proto__ => Object.prototype, Object.prototype.__proto__ => null
  • 什么是__proto__呢?
    我们先来了解对象和函数.

  • 对象
    对象由new一个Function实例, 或者通过直接对象值({ field: value })来产生, 后者等价于直接new Object({...}).

({}).__proto__ === Object.prototype // true
// 顺带一提, 对象还有一个构造器属性, 指向实例化该对象的Function对象, 因此有:
obj.constructor.prototype === obj.__proto__ // true
// 如此, 我们可将__proto__称为"构造器原型"
  • 函数
    函数是一种特殊对象, 每个函数都有一个名为prototype的对象属性, 当new这个函数时, 生产的新对象的__proto__属性将指向该对象,
    从而新对象继承了一个原型链.

  • 属性委托
    属性向上查找的一个过程.

Code

class B {
    constructor() {
        this.b = 'bbb';
    }
}
class A extends B {
    constructor() {
        super();
        this.a = 'aaa';
    }
}
let a = new A();
console.log(a.__proto__ === A.prototype); // true
console.log(a.__proto__.__proto__ === Object.prototype); // false
console.log(a.__proto__.__proto__ === B.prototype); // true
console.log(a.__proto__.__proto__.__proto__ === Object.prototype); // true
let b = new B();
console.log(b.__proto__ === B.prototype); // true
console.log(b.__proto__.__proto__ === Object.prototype); // true

END

posted @ 2020-07-14 10:22  develon  阅读(97)  评论(0编辑  收藏  举报