JavaScript中的每个对象都有一个原型对象,它充当了对象的模板,定义了对象共享的属性和方法。如果在当前对象中找不到某个属性或方法,JavaScript会自动去原型对象中查找,如果在原型对象中也找不到,则会去原型对象的原型对象中查找,直到最终找到Object对象的原型对象为止,这个链式结构就是原型链。
在JavaScript中,我们可以使用原型链来实现继承。具体来说,我们可以将父类的实例作为子类的原型对象,子类就可以共享父类实例中的属性和方法。这种继承方式被称为原型式继承。
下面是一个示例:
function Animal(name) {
this.name = name;
}
Animal.prototype.sayName = function() {
console.log("My name is " + this.name);
}
function Dog(name, age) {
Animal.call(this, name);
this.age = age;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.sayAge = function() {
console.log("I am " + this.age + " years old");
}
var dog = new Dog("Lucky", 3);
dog.sayName(); // My name is Lucky
dog.sayAge(); // I am 3 years old
在上面的例子中,我们定义了Animal和Dog两个构造函数,Animal定义了一个属性name和一个方法sayName,Dog继承了Animal,并新增了一个属性age和一个方法sayAge。具体实现方式是:
Animal.call(this, name)
调用Animal的构造函数,将name属性继承下来Object.create
创建一个新的对象,并将它赋值给Dog.prototype,这样Dog的实例就可以共享Animal中定义的属性和方法了使用ES6中的class语法可以更方便地实现继承:
class Animal {
constructor(name) {
this.name = name;
}
sayName() {
console.log("My name is " + this.name);
}
}
class Dog extends Animal {
constructor(name, age) {
super(name);
this.age = age;
}
sayAge() {
console.log("I am " + this.age + " years old");
}
}
var dog = new Dog("Lucky", 3);
dog.sayName(); // My name is Lucky
dog.sayAge(); // I am 3 years old
在ES6中,我们可以通过extends
关键字来实现继承,super
关键字用于调用父类的构造函数和方法。