JavaScript中的原型(prototype)和原型链(prototype chain)是面向对象编程中重要的概念,用于实现继承和对象之间的关联。
-
原型(prototype):
- 在JavaScript中,每个对象都有一个原型。原型是一个对象,它包含可以在实例对象中共享的属性和方法。
- 对象可以通过构造函数创建,而构造函数又有一个原型对象。通过原型,所有通过该构造函数创建的实例对象可以访问相同的属性和方法。
- 原型可以看作是一个对象的模板,实例对象可以继承原型对象的属性和方法。
示例:
function Person(name) { this.name = name; } // 添加一个方法到Person的原型 Person.prototype.sayHello = function() { console.log("Hello, " + this.name + "!"); }; // 创建一个Person的实例 var person1 = new Person("John"); // 通过原型链访问原型上的方法 person1.sayHello(); // 输出: Hello, John! -
原型链(prototype chain):
原型链是由对象的原型形成的链状结构,用于在查找属性或方法时沿着这个链进行搜索。当试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript引擎会沿着原型链向上查找,直到找到匹配的属性或方法或者到达原型链的末端(即Object.prototype)。
例如:
function Animal(name) {
this.name = name;
}
Animal.prototype.eat = function() {
console.log(this.name + ' is eating.');
};
function Dog(name, breed) {
Animal.call(this, name);
this.breed = breed;
}
// 继承 Animal 的原型
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() {
console.log(this.name + ' is barking.');
};
var myDog = new Dog('Buddy', 'Golden Retriever');
myDog.bark(); // 输出:Buddy is barking.
myDog.eat(); // 输出:Buddy is eating.
在这个例子中,myDog 对象通过原型链继承了 Animal 的方法,并且 Dog 的原型是通过 Object.create(Animal.prototype) 来创建的,从而建立了原型链。
总结起来,原型是对象的一个属性,用于指向另一个对象,而原型链是一系列对象的连接,用于在查找属性或方法时进行继承。这种原型链的机制使得 JavaScript 中的对象能够共享属性和方法,实现了简单而有效的继承。