原型链是 JavaScript 中实现继承的核心机制。每个对象都有一个指向其原型对象的私有链接(通过 [[Prototype]]
内部属性),而原型对象自身也可能拥有原型,这种链式结构被称为原型链。当访问对象的属性时,若对象自身不存在该属性,则会沿原型链逐级向上查找,直到找到属性或抵达链的末端(null
)。
关键点解析
- 原型继承:对象的属性和方法可通过原型链继承自其原型对象。
- 查找机制:若对象自身无某属性,引擎会递归查找原型链,直至
null
停止。 - 默认原型:
- 普通对象的原型为
Object.prototype
(如{}
)。 Object.prototype
的原型是null
,处于原型链顶端。- 数组的原型是
Array.prototype
,函数的原型是Function.prototype
,均继承自Object.prototype
。
- 普通对象的原型为
Object.prototype.__proto__
的值
- 值为
null
:
由于Object.prototype
是原型链的终点,其__proto__
属性指向null
,表示无更高层级的原型。
代码示例
// 普通对象的原型链
const obj = {};
console.log(obj.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null
// 数组的原型链
const arr = [];
console.log(arr.__proto__ === Array.prototype); // true
console.log(arr.__proto__.__proto__ === Object.prototype); // true
console.log(arr.__proto__.__proto__.__proto__); // null
注意事项
__proto__
的替代方案:
虽然__proto__
被广泛支持,但更推荐使用Object.getPrototypeOf(obj)
获取原型,Object.setPrototypeOf(obj, proto)
设置原型,以确保代码规范和兼容性。
通过理解原型链,可以更好地掌握 JavaScript 的继承机制及对象间的关系。