前言
- 原型链初步
一个对象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