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
属性。
分类:
JavaScript
标签:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)