一、构造继承的概念
构造继承是一种通过调用父类构造函数来实现对象之间继承关系的方式。在这种方式下,子类可以通过调用父类构造函数来获得父类的属性和方法,并且可以添加自己独有的属性和方法。例如:
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function() { console.log('Hi, my name is ' + this.name + ', I am ' + this.age + ' years old.'); }; function Student(name, age, gender) { Person.call(this, name, age); this.gender = gender; } const student = new Student('Tom', 18, 'male'); student.sayHello(); // 报错:student.sayHello is not a function
在上面的例子中,定义了一个 Person 构造函数和一个 Student 构造函数,并且通过调用 Person 的 call 方法来实现继承。但是,由于 Student 没有继承 Person 的原型,因此调用 student.sayHello 方法会报错。
二、构造继承的使用方法
为了解决上述问题,我们可以使用 Object.create 方法来实现原型对象的继承。具体使用方法如下:
- 定义父类构造函数:
function Person(name, age) { this.name = name; this.age = age; }
- 在父类的原型上定义方法和属性:
Person.prototype.sayHello = function() { console.log('Hi, my name is ' + this.name + ', I am ' + this.age + ' years old.'); };
- 定义子类构造函数:
function Student(name, age, gender) { Person.call(this, name, age); this.gender = gender; }
- 使用 Object.create 方法将子类的原型设置为父类的实例:
Student.prototype = Object.create(Person.prototype);
- 将子类的原型构造函数指向子类本身:
Student.prototype.constructor = Student;
- 添加子类独有的方法和属性:
Student.prototype.sayGender = function() { console.log('My gender is ' + this.gender); };
- 创建子类对象并调用方法:
const student = new Student('Tom', 18, 'male'); student.sayHello(); // 输出: Hi, my name is Tom, I am 18 years old. student.sayGender(); // 输出: My gender is male
三、构造继承的注意事项
- 构造继承只能继承父类的实例属性和方法,而不能继承父类的原型属性和方法。
- 构造继承可能会导致一些性能问题,因为每个子类对象都需要重新创建父类的实例对象,并且可能存在多层继承关系。这会导致在访问某些属性或方法时需要沿着原型链进行查找,从而降低程序的执行效率。
- 在使用构造继承时,需要注意避免循环引用的问题。例如:
function Child() {} Child.prototype = new Parent(); Parent.prototype.child = new Child();
在上面的例子中,Child 的原型继承了 Parent,并且 Parent 的原型又包含了一个 Child 实例。这样会导致一个循环引用的问题,从而影响程序的执行效率。