请描述 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() 时:

  1. 查找 p 自身 → 没有 toString
  2. 查找 p.__proto__(Person.prototype)→ 没有
  3. 查找 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]'

注意事项

同分类其他题目