在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); // true console.log(alice instanceof Student); // false console.log(bob instanceof Person); // true console.log(bob instanceof Student); // true
如上所述,使用寄生組合式繼承能夠非常方便地創建對象,并且可以在不同的對象之間共享屬性和方法,提高代碼的復用性和可讀性。