在JavaScript中,原型(prototype)和原型链是实现对象间继承的主要机制。
原型(prototype)是JavaScript的一个内部属性,是一个指针或者链接,指向创建它的构造函数的原型对象。当我们在对象上调用一个方法或属性,JavaScript会首先在对象本身查找,如果没有找到,它会沿着原型链向上查找,直到找到为止。
例如:
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name);
}
let person1 = new Person('Tom');
person1.sayName(); // 输出:Tom
在这个例子中,sayName
方法是定义在Person
的原型上的。当我们在person1
对象上调用sayName
方法时,JavaScript会首先在person1
对象本身查找,没有找到,然后它会在Person
的原型上查找,找到了就调用。
原型链是由原型链接组成的,形成了一条链式结构。当查找对象属性时,JavaScript会沿着原型链向上查找,直到找到相应的属性或到达原型链的末端。原型链的尽头通常是Object.prototype
,它是所有对象默认的原型。
原型和原型链的特点主要包括:
- 所有的对象都有原型,所有的原型都链接到原型链上。
- 当查找对象属性时,如果对象本身没有这个属性,那么JavaScript会沿着原型链向上查找,直到找到为止。
- 当我们在对象上调用一个方法时,这个方法实际上可能是定义在原型上的,这可以实现方法的共享,节省内存。
需要注意的是,虽然原型和原型链为我们提供了强大的继承机制,但也需要小心处理。如果我们在原型上定义了可变的数据(如数组或对象),那么所有的实例都会共享这个数据,一旦有一个实例修改了这个数据,其他实例的这个数据也会被修改。