请描述 JavaScript 的原型链
原型链是 JavaScript 实现继承的机制。每个对象都有一个 __proto__(即 [[Prototype]])指向其构造函数的 prototype 对象。
原型链结构
实例对象
└─ __proto__ → 构造函数.prototype
├─ constructor → 构造函数本身
└─ __proto__ → 父构造函数.prototype
└─ ... → Object.prototype
└─ __proto__ → null具体示例
function Person(name) {
this.name = name
}
Person.prototype.sayHi = function () {
console.log('Hi, ' + this.name)
}
const p = new Person('Tom')
p.sayHi() // 'Hi, Tom'(通过原型链找到)
p.__proto__ // Person.prototype
p.__proto__.__proto__ // Object.prototype
p.__proto__.__proto__.__proto__ // null(原型链终点)属性查找过程
访问 p.toString() 时:
- 查找
p自身 → 没有toString - 查找
p.__proto__(Person.prototype)→ 没有 - 查找
p.__proto__.__proto__(Object.prototype)→ 找到toString
常见判断方法
p.constructor === Person // true
Person.prototype.isPrototypeOf(p) // true
Object.getPrototypeOf(p) === Person.prototype // true
Object.prototype.toString.call(p) // '[object Object]'注意事项
__proto__是非标准属性,生产环境应使用Object.getPrototypeOf()/Object.setPrototypeOf()- 修改原型链(
Object.setPrototypeOf)性能差,应在创建时通过Object.create()设置