JavaScript中每个对象都有一个原型对象,这个原型对象又有自己的原型对象,层层向上直到最终的原型对象为null。这种关系就成为原型链。
当我们访问一个对象的某个属性时,如果对象本身没有这个属性,JavaScript就会去它的原型对象上寻找这个属性,如果原型对象上还没有,就会去它的原型的原型对象上寻找,直到找到最终的原型对象或者属性为undefined为止。这就是原型链的基本用途。
原型链的作用就是允许对象继承它的原型对象的属性和方法,可以实现面向对象的编程方式。
例如,我们可以创建一个Animal的构造函数,并在它的原型上添加一个eat方法。然后创建一个Dog的构造函数,并将其原型对象指向Animal的实例对象,这样Dog的实例对象就可以继承Animal的eat方法了。
```javascript
function Animal() {}
Animal.prototype.eat = function() {
console.log('Animal is eating');
}
function Dog() {}
Dog.prototype = new Animal();
var dog = new Dog();
dog.eat() // 输出:Animal is eating
```
在上面的代码中,当我们调用dog.eat()方法时,因为dog对象本身没有eat方法,JavaScript在它的原型上继续寻找,发现Dog的原型指向了Animal的实例对象,而这个实例对象是有eat方法的,所以最终输出了'Animal is eating'。通过继承,我们可以避免代码的重复,提高代码的复用率。