JavaScript中的继承与原型链
在JavaScript中,原型链(prototype chain)是实现继承的一种机制。每个对象都有一个内部链接到另一个对象,这个对象称为原型(prototype)。原型对象也有自己的原型,层层链接,最终指向 null。这种层层链接的结构就称为原型链。
当你访问一个对象的属性时,JavaScript 引擎首先会在对象自身的属性中查找。如果没有找到,它会沿着原型链向上查找,直到找到该属性或到达原型链的末端(即 null)。
以下是一个简单的例子来说明原型链的工作原理:
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log('Hello, my name is ' + this.name);
};
var alice = new Person('Alice');
alice.sayHello(); // 输出: Hello, my name is Alice
console.log(alice.hasOwnProperty('name')); // 输出: true
console.log(alice.hasOwnProperty('sayHello')); // 输出: false
console.log(alice.__proto__ === Person.prototype); // 输出: true
console.log(Person.prototype.__proto__ === Object.prototype); // 输出: true
console.log(Object.prototype.__proto__ === null); // 输出: true
在这个例子中:
alice对象是通过Person构造函数创建的。alice对象的原型是Person.prototype。Person.prototype的原型是Object.prototype。Object.prototype的原型是null,表示原型链的末端。
当调用 alice.sayHello() 时,JavaScript 引擎首先在 alice 对象自身查找 sayHello 方法。如果没有找到,它会查找 alice 的原型,即 Person.prototype,在这里找到了 sayHello 方法并执行。
实例对象没有 prototype 属性
调用 alice.prototype.sayHello() 会导致错误,因为 alice 是一个实例对象,而不是一个构造函数。实例对象没有 prototype 属性,只有构造函数才有 prototype 属性。
具体来说,alice 是通过 Person 构造函数创建的实例对象。实例对象的原型可以通过 __proto__ 属性(或现代 JavaScript 中的 Object.getPrototypeOf 方法)访问,但它们没有 prototype 属性。

浙公网安备 33010602011771号