在Javascript中,继承是非常重要的概念,在许多编程语言中都有广泛运用。继承能够大大提高代码的复用性,但是Javascript中默认继承机制并不适合所有场景。因此,我们需要使用寄生组合式继承。
比如有这样一个父类Person:
function Person(name, age) {this.name = name;this.age = age;}Person.prototype.sayHello = function() {console.log("Hello, my name is " + this.name + ", and I am " + this.age + " years old.");};
我们现在想要创建一个Student类,继承自Person类,但是要增加一个score属性。我们可以这样写:
function Student(name, age, score) {Person.call(this, name, age);this.score = score;}Student.prototype = Object.create(Person.prototype);Student.prototype.constructor = Student;
在上面的代码中,我们首先调用了Person构造函数来初始化Student对象本身的属性。接着,我们将Student.prototype指向一个新创建的Person实例,这样就可以继承Person原型中的方法和属性。最后,我们将Student.prototype.constructor重新指回Student本身。
这种继承方式被称为“寄生组合式继承”,因为它是通过组合构造函数继承和原型继承两种方式进行的,并且使用了一个“寄生”对象来继承原型。
使用寄生组合式继承,我们可以非常方便地创建对象,并且可以在不同的对象之间共享属性和方法。例如:
var alice = new Person("Alice", 25);var bob = new Student("Bob", 22, 90);alice.sayHello(); // 输出 "Hello, my name is Alice, and I am 25 years old."bob.sayHello(); // 输出 "Hello, my name is Bob, and I am 22 years old."console.log(alice instanceof Person); // trueconsole.log(alice instanceof Student); // falseconsole.log(bob instanceof Person); // trueconsole.log(bob instanceof Student); // true
如上所述,使用寄生组合式继承能够非常方便地创建对象,并且可以在不同的对象之间共享属性和方法,提高代码的复用性和可读性。