一、原型
隐式原型
对象具有属性 __proto__
,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。Object.getPrototypeOf()
原型属性
每个对象都会在其内部初始化一个属性——原型属性(prototype
),这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。
constructor
原型对象也有一个属性,叫做 constructor
,这个属性包含了一个指针,指回原构造函数。
关系
instance.constructor.prototype = instance.__proto__
判断
方法 | 描述 |
---|---|
hasOwnProperty() | 查找自身属性 |
instanceof | 对象(实例)与构造函数在原型链上是否有关系 |
二、原型链
定义
- 当我们访问一个对象的属性时,如果自身有xxx属性,则访问它(自有属性);
- 如果没有,就通过
__proto__
属性找到其原型链的上一级原型对象,看它有没有xxx属性; - 如此递归查找,直至找到xxx属性或直到原型链顶端
Object.prototype
对象为止; - 如果整个原型链上都没有,才返回 undefind;
- 我们把这种通过原型层层连接起来的关系称为原型链。
模拟原型链
var Shape = {
getArea:function() {
return "area: "+this.area;
}
};
var Retangle = {
getEdge:function() {
return "edge: "+this.edge;
}
};
var retangleIns = {
area : 20,
edge : 4
};
// 模拟原型链,将3个对象连接成一条原型链:
// Shape <- __proto__ <- Retangle <- __proto__ <- retangleIns
retangleIns.__proto__ = Retangle;
Retangle.__proto__ = Shape;
// 原型链连接后,getArea 和 getEdge 方法成功执行
console.log("原型链连接后,retangleIns.getArea() = " + retangleIns.getArea());
console.log("原型链连接后,retangleIns.getEdge() = " + retangleIns.getEdge());