JavaScript 中什么是原型链 (Prototype Chain)?

推荐答案

在 JavaScript 中,原型链(Prototype Chain)是对象之间通过原型(prototype)相互关联的一种机制。每个对象都有一个内部属性 [[Prototype]](可以通过 __proto__ 访问),它指向该对象的原型。当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法,或者到达原型链的顶端(即 null)。

本题详细解读

1. 原型链的基本概念

  • 原型(Prototype):每个 JavaScript 对象(除了 null)都有一个原型对象,原型对象也是一个对象,它包含共享的属性和方法。
  • 原型链(Prototype Chain):当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法,或者到达原型链的顶端(即 null)。

2. 原型链的构建

  • 构造函数与原型:每个构造函数都有一个 prototype 属性,指向一个对象,这个对象就是通过该构造函数创建的实例的原型。
  • 实例与原型:通过构造函数创建的实例对象,其 __proto__ 属性指向构造函数的 prototype 对象。
-- -------------------- ---- -------
-------- ------------ -
    --------- - -----
-

------------------------- - ---------- -
    ------------------- -- ---- -- ---------------
--

----- ------- - --- ----------------
------------------- -- --- ------ -- ---- -- -----

在上面的例子中,person1 对象本身没有 sayHello 方法,但它通过原型链找到了 Person.prototype 上的 sayHello 方法。

3. 原型链的查找过程

  • 当访问一个对象的属性或方法时,JavaScript 引擎首先检查对象本身是否有该属性或方法。
  • 如果没有,引擎会沿着 __proto__ 属性向上查找,直到找到该属性或方法,或者到达原型链的顶端(即 null)。

在上面的例子中,person1 对象本身有 name 属性,但没有 sayHello 方法,因此 sayHello 方法是通过原型链找到的。

4. 原型链的顶端

  • 原型链的顶端是 Object.prototype,它是所有对象的原型。
  • Object.prototype 的原型是 null,表示原型链的结束。

5. 修改原型链

  • 可以通过修改对象的 __proto__ 属性来改变原型链,但这种做法不推荐,因为它会影响性能并且可能导致不可预期的行为。
  • 更推荐使用 Object.create() 方法来创建一个新对象,并指定其原型。

在这个例子中,dog 对象的原型是 animal 对象,因此 dog 可以访问 animalmakeSound 方法。

纠错
反馈