2012-04-04 49 views
0

我有一些共享大部分初始化的僞類。我決定取出這個初始化並創建一個基類,它們將繼承它。超級()調用的Javascript繼承

function BaseClass(param1, param2) { 
    ... 
} 

function SubClassA(param1) { 
    ... 
} 

function SubClassB(param1) { 
    ... 
} 

我想SubClass1SubClass2BaseClass以下方式繼承:

SubClassA(param1)構造函數調用BaseClass(param1, "I am A.")

SubClassB(param1)構造函數調用BaseClass(param1, "I am B.")

所以BaseClass增加了一些特性給他們。然後這兩個子類自己進行初始化。

現在我不能只做SubClassA.prototype = new BaseClass(),因爲我想要超級構造函數來獲取參數。如何優雅地做到這一點?

回答

2
function SubClassA(param1) { 
    BaseClass.call(this, param1, "I Am A."); 
} 

function SubClassB(param1) { 
    BaseClass.call(this, param1, "I Am B."); 
} 

當你做一個new SubClassA(param1)new SubClassB(param1)基類的構造將與適當的參數來調用。

此外,還有其他方法可以定義基類,而不是SubClassA.prototype = new BaseClass()。有關詳細信息,請查看this問題。 (免責聲明:有人問我旁邊。)

+0

你該死忍者的區域! ;) – kiswa 2012-04-04 14:26:53

+0

啊,call()沒有出現在我的腦海裏。好的,謝謝;)@ kiswa,如果你不介意,我會接受taskinoor,因爲他是第一張海報:) – Imp 2012-04-04 14:33:31

+0

似乎對我來說很公平。但隨時都可以贊同!;)另外,如果您有興趣,我還會添加一個鏈接到MDN以獲得更多詳細信息。 – kiswa 2012-04-04 14:34:54

1

我有類似的東西,我這樣做:

function SubClass (param1) { 
    BaseClass.call(this, param1, "I am A."); 
} 

這給我的BaseClass的​​實例對象的所有屬性。

編輯:這是關於the call function的一些信息。這很有用,因爲您可以指定呼叫期間的內容this並提供參數列表。

2

我做了目的的JavaScript幫手稱爲Class.js - https://github.com/eppz/eppz-js - 索利因爲這個原因(沒有任何額外的樣板代碼申請,也減少了原型麻煩)。

使用它可以很容易地使這個設置爲:

var BaseClass = Class.extend 
({ 
    param1: null, 
    param2: null, 

    construct: function(param1, param2) 
    { 
     this.param1 = param1; 
     this.param2 = param2; 
    }, 
}); 

var SubClassA = BaseClass.extend 
({ 
    construct: function(param1) 
    { 
     this.super.construct(param1, 'This is A.'); 
    }, 
}); 

var SubClassB = BaseClass.extend 
({ 
    construct: function(param1) 
    { 
     this.super.construct(param1, 'This is B.'); 
    }, 
}); 

var a = new SubClassA('A stuff.'); 
var b = new SubClassB('B stuff.'); 

console.log(a.param1); // A stuff. 
console.log(b.param1); // B stuff. 

console.log(a.param2); // This is A. 
console.log(b.param2); // This is B. 
0

添加的面積法,以矩形的prototype.Create滿足下列一個Square類:

  1. 這是矩形的子類。
  2. 它包含一個構造函數,沒有其他方法。
  3. 它可以使用Rectangle類區域的方法來打印廣場

    class Rectangle { 
    
        constructor(w, h) { 
        this.w = w; 
        this.h = h; 
        } 
    } 
    Rectangle.prototype.area = function() 
    { 
        var a = this.w * this.h; 
        return a; 
    } 
    class Square extends Rectangle{ 
        constructor(r) { 
         super(r, r) 
         } 
        } 
    
        const rec = new Rectangle(3, 4); 
        const sqr = new Square(3); 
    
        console.log(rec.area()); 
        console.log(sqr.area());