>[danger]讲一下原型和原型链 在 JavaScript 中,每个对象都有一个指向其原型的内部链接。这个链接可以通过 `prototype` 属性来访问,它定义了对象的共享属性和方法。当我们访问一个对象的属性时,如果该对象本身没有这个属性,那么 JavaScript 引擎就会沿着该对象的原型链向上查找,直到找到该属性,或者查找到原型链的顶端为止。 每个函数都有一个 `prototype` 属性,它是一个对象。当函数用作构造函数创建对象时,JavaScript 引擎自动将新创建的对象的 `__proto__` 属性指向构造函数的 `prototype` 属性,从而实现了原型链。因此,通过在构造函数的 `prototype` 对象中添加函数属性和方法,我们可以使所有由该构造函数创建的对象都共享这些属性和方法。 下面是一个简单的示例,演示了如何使用原型和原型链: ```javascript // 创建一个构造函数 function Person(name, age) { this.name = name; this.age = age; } // 在构造函数的 prototype 上定义方法 Person.prototype.greet = function() { console.log('Hello, my name is ' + this.name); }; // 创建一个 Person 对象 const person1 = new Person('Alice', 25); // 调用 person1 的 greet 方法 person1.greet(); // 输出: Hello, my name is Alice // 查找 person1 对象的原型链 console.log(person1.__proto__); // 输出: Person.prototype console.log(person1.__proto__.__proto__); // 输出: Object.prototype console.log(person1.__proto__.__proto__.__proto__); // 输出: null ``` 在上面的示例中,我们首先定义了一个 `Person` 构造函数,然后在其 `prototype` 对象中添加了 `greet` 方法。接着,我们使用该构造函数创建了一个 `person1` 对象,并调用了其 `greet` 方法。 最后,我们通过访问 `person1` 对象的 `__proto__` 属性来显示其原型链。由于 `person1` 的构造函数是 `Person`,因此它的原型为 `Person.prototype`。`Person.prototype` 的原型是 `Object.prototype`,因为所有 JavaScript 对象都继承自基本 `Object` 类型。`Object.prototype` 没有原型,因此查找到原型链的顶端时会返回 `null`。 通过原型和原型链机制,JavaScript 中的对象可以实现属性和方法的共享和继承,这也是 JavaScript 中的一项重要而强大的特性。