我正在重寫一個JavaScript項目,我希望能夠使用面向對象的方法來組織當前代碼的混亂。主要擔心的是這個JavaScript應該作爲第三方網站內部的一個小部件運行,並且我不能將它與其他網站可能使用的其他JavaScript庫衝突。什麼將是一個很好的簡約的Javascript繼承方法?
所以我在尋找一種方式來寫「類像」繼承在JavaScript中有以下要求:
- 無需外部庫或事物,將與外部庫衝突(即排除複製&從外部庫中粘貼)。
- Minimalistic - 我不希望支持代碼大於幾行代碼,我不希望開發人員在每次定義新的類或方法時都需要大量的鍋爐板。
- 應允許動態擴展父對象,以便子對象查看更改(原型)。
- 應該允許構造函數鏈接。
- 應允許
super
類型的調用。 - 應該仍然覺得JavaScript-ish。
起初,我試圖用簡單的原型鏈的工作:
function Shape(x,y) {
this.x = x;
this.y = y;
this.draw = function() {
throw new Error("Arbitrary shapes cannot be drawn");
}
}
function Square(x,y,side) {
this.x = x;
this.y = y;
this.side = side;
this.draw = function() {
gotoXY(this.x,this.y); lineTo(this.x+this.side, this.y); ...
}
}
Square.prototype = new Shape();
這解決了要求1,2和6,但ID不允許超級電話(新的功能覆蓋父函數),構造函數鏈和動態擴展父項不會將新方法提供給子類。
任何建議將受到歡迎。
你可以調用超級方法。如果你要在Triangle中定義繪製,你可以通過Triangle.prototype.draw獲得超級繪製 – 2009-09-10 11:21:25
問題在於「超級」方法不能訪問當前對象的字段 - 「this」是原型而不是「this」畫。我可以這樣做'Square.prototype.draw.apply(this,arguments)',但是這很笨拙,我通常不喜歡按名稱調用它們的容器類的方法(他們應該在每個地方都使用'this')。 – Guss 2009-09-10 11:54:40
和this.constructor.prototype.draw.apply(this,arguments) – 2009-09-10 12:29:11