JavaScript中的對象繼承是非常有用的特性。它允許我們從一個對象“繼承”既有的屬性和方法,并在此基礎上添加自己特有的屬性和方法。然而,JavaScript中的繼承方式有很多,有些方式復雜難懂,不易維護。本文將介紹一種優秀的繼承方式——偽經典繼承。
偽經典繼承(Pseudo-Classical Inheritance)在JavaScript中被廣泛使用。它模擬了類、構造函數和實例化,通過原型鏈實現繼承。下面是一個例子:
function Animal(name) { this.name = name; } Animal.prototype.say = function() { console.log("I'm " + this.name); }; function Cat(name) { Animal.call(this, name); } Cat.prototype = Object.create(Animal.prototype); Cat.prototype.constructor = Cat; var kitty = new Cat("Kitty"); kitty.say(); // "I'm Kitty"
上面的代碼定義了一個Animal類,通過它可以創建一個具有名字的動物,并且可以說出它的名字。接著定義了一個Cat類,繼承了Animal類,并且通過實例化Cat類可以創建一只貓,并且可以說出它的名字。這里的繼承方式就是偽經典繼承。
偽經典繼承的核心是在子類的構造函數中調用父類的構造函數。在上面的例子中,Animal.call(this, name) 表示 Cat類的實例繼承了Animal類的屬性和方法。具體來說,這句代碼執行時,Cat類的實例的this指向了新創建的對象本身,即用 new Cat(…) 實例化出的對象,因此,Animal類的name屬性會被正確地綁定到Cat類的實例上。
接下來的代碼 Cat.prototype = Object.create(Animal.prototype) 將Cat的原型指向了Animal的原型,這樣,通過Cat的實例可以訪問Animal的原型中定義的方法和屬性。
最后一句代碼 Cat.prototype.constructor = Cat 是為了保證Cat類自身的constructor指向 Cat,而不是 Animal。
總之,偽經典繼承是一種優秀的繼承方式,它可以實現在JavaScript中的類定義與繼承,非常靈活,也比較符合開發者對類的面向對象思想的要求。