理解原型和原型链是掌握JavaScript面向对象编程本质的关键。这是一种基于原型的语言,与基于类的语言有着根本区别,其核心机制在于对象之间的直接继承关系。
![图片[1]-什么是原型和原型链?-速码派](http://www.sumapai.com/wp-content/uploads/2026/01/d752316edf0a4cf7ae578fd7bfe6ef14tplv-tb4s082cfz-aigc_resize_1080_1080-1024x683.webp)
原型对象的概念
每个JavaScript函数(除了箭头函数等少数特例外)都有一个prototype属性。这个属性是一个对象,被称为原型对象。当你使用new关键字调用构造函数创建实例时,该实例的内部[[Prototype]]链(可通过__proto__属性访问)会指向构造函数的prototype对象。
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
return `Hello, I'm ${this.name}`;
};
const alice = new Person('Alice');
console.log(alice.greet());
在这个例子中,alice实例本身没有greet方法。当调用alice.greet()时,JavaScript引擎会首先在alice对象自身上查找,如果没有找到,则会沿着alice.__proto__(即Person.prototype)去查找并调用该方法。
原型链的查找机制
原型链正是由这一系列的__proto__链接构成的。如果在一个对象的原型上也没有找到所需的属性或方法,引擎会继续查找原型的原型,直到Object.prototype,它的__proto__是null,这便构成了链的终点。
console.log(alice.toString());
alice本身和Person.prototype上都没有toString方法。查找会继续到Person.prototype.__proto__(即Object.prototype),并在这里找到该方法。这种逐级向上的查找路径就是原型链。
原型链的实际应用与影响
这一机制解释了为什么所有对象都能使用诸如toString、hasOwnProperty等方法,因为这些方法定义在Object.prototype上。它也解释了“继承”是如何工作的:通过设置子构造函数的prototype为父构造函数的一个实例。
function Developer(name, language) {
Person.call(this, name);
this.language = language;
}
Developer.prototype = Object.create(Person.prototype);
Developer.prototype.constructor = Developer;
Developer.prototype.code = function() {
return `Writing ${this.language} code`;
};
const bob = new Developer('Bob', 'JavaScript');
console.log(bob.greet());
console.log(bob.code());
需要注意的是,直接修改内置对象的原型(如Array.prototype)会影响所有实例,虽然强大但具有风险,通常不推荐。在现代开发中,ES6的class语法是这种原型机制的语法糖,它让继承的写法更清晰,但底层依然遵循原型链的规则。






















暂无评论内容