原型是JavaScript实现继承的基础,每个函数都有prototype属性指向原型对象,实例通过__proto__链接到构造函数的prototype,形成原型链;当访问对象属性时,若自身不存在,则沿原型链向上查找直至Object.prototype或null,实现属性和方法的共享与继承。

在JavaScript中,原型与原型链是理解面向对象编程的核心机制。不同于传统的类继承语言(如Java或C++),JavaScript采用的是基于原型的继承模型。掌握原型和原型链的工作原理,不仅能帮助你写出更高效、可维护的代码,还能深入理解语言底层行为。
每个JavaScript函数在创建时都会自动拥有一个prototype属性,这个属性指向一个对象,即“原型对象”。该原型对象包含可以被实例共享的属性和方法。
当通过构造函数使用new关键字创建实例时,实例的内部[[Prototype]](通常可通过__proto__访问)会指向构造函数的prototype对象。
例如:
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
console.log("Hello, I'm " + this.name);
};
const alice = new Person("Alice");
alice.greet(); // 输出: Hello, I'm Alice
这里,alice本身没有greet方法,但它能调用该方法,是因为引擎沿着原型链找到了Person.prototype上的定义。
当访问一个对象的属性或方法时,JavaScript引擎首先检查该对象自身是否具有该成员。如果没有,就会查找其[[Prototype]]所指向的对象。如果仍未找到,继续向上查找,直到原型链顶端——也就是Object.prototype。若仍不存在,则返回undefined。
这条逐级向上的查找路径就是“原型链”。
典型结构如下:
比如:
console.log(alice.toString()); // 调用的是 Object.prototype.toString
alice没有toString,原型上也没有,最终在Object.prototype中找到。
初学者常混淆__proto__和prototype,关键在于它们属于不同主体:
简而言之:
ES6引入了class关键字,让JavaScript看起来更像传统面向对象语言,但其底层仍是基于原型的。
class Animal {
constructor(type) {
this.type = type;
}
speak() {
console.log(this.type + " makes a sound");
}
}
const dog = new Animal("Dog");
dog.speak();
上述代码本质上等价于使用构造函数和原型手动定义。class只是语法糖,真正实现继承的方式依然是原型链。
子类继承父类时,子类实例的原型链会延伸至父类原型:
这使得子类可以复用父类的方法,实现多层继承结构。
基本上就这些。原型与原型链看似抽象,实则是JavaScript灵活动态特性的根基。理解它,才能真正驾驭这门语言的对象系统。
以上就是原型与原型链深度探索_面向对象编程基石的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号