JavaScript中的继承与原型链

继承与原型链 - JavaScript | MDN

在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

在这个例子中:

  1. alice 对象是通过 Person 构造函数创建的。
  2. alice 对象的原型是 Person.prototype
  3. Person.prototype 的原型是 Object.prototype
  4. 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 属性。

posted @   EmptyEmeraldTablet  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示