2016-03-11 57 views
2

2級我有A類和B我想繼承使用C類的一類兩個班,我使用下面的代碼 -如何繼承在JavaScript

它的工作的罰款單類。現在我想繼承類B.

function A() { 
} 

function B() { 
} 

function C() { 
} 

C.prototype = Object.create(A.prototype); 
C.prototype.constructor = C; 
+0

希望這有助於http://stackoverflow.com/questions/9163341/multiple-inheritance-prototypes-in-javascript –

+0

注:在你的榜樣,你錯過了從''到A'必要呼叫C':'A.call(this);' –

回答

3

的對象只有一個原型鏈。除非A.prototypeB.prototype之間存在關係,否則它們不能同時位於單個對象的原型鏈上。

您可以創建一個包含對A.prototypeB.prototype什麼,並以此作爲對C.prototype對象組合的新對象:

function C() { 
    A.call(this); 
    B.call(this); 
} 
C.prototype = Object.assign({}, A.prototype, B.prototype); // Object.assign is 
                  // ES2015, but can be 
                  // shimmed 
C.prototype.constructor = C; 

...但要注意:

  1. 如果您之後在A.prototypeB.prototype上添加/刪除內容,那些更改將不會反映在C.prototype或通過new C創建的實例上。
  2. instanceof不會將通過new C創建的對象視爲instanceof Ainstanceof B,因爲A.prototypeB.prototype不在其原型鏈中。
  3. 如果A.prototypeB.prototype都具有相同的屬性(也許它們都覆蓋toString,例如),您只能有一個或另一個。 (在上面的代碼中,B.prototype會贏。)
+0

我在這個代碼上看到一個問題,你可以在這個鏈接上看到 - http://stackoverflow.com/questions/35988171/multiple-inheritance-console-output – pankaj98

+0

@ pankaj98 :是的,但這是一個不同的問題。 *據我所知,這個問題已被回答。 –

-1

使用A類繼承B類,然後C類繼承A類。 JavaScript只適用於單一繼承。

0

多重繼承在JS中不起作用。儘管如此,爲什麼不嘗試像Mix-Ins/Traits這樣的東西?而不是構建複雜的繼承鏈,而不是構建複雜的繼承鏈。

而不是試圖找出WalkingSpeakingPet是否應該從WalkingPetSpeakingPet繼承,你可以改爲使用特質,並將它們添加到寵物。

function Walker (target) { 
    return { 
    walk (x, y) { console.log("I'm walking!"); } 
    }; 
} 

function Flyer (target) { 
    return { 
    fly (x, y, z) { console.log("I'm flying!"); } 
    }; 
} 

function Swimmer (target) { 
    return { 
    swim (x, y, z) { console.log("I'm swimming!"); } 
    }; 
} 


function Pet (type, name) { 
    return { type, name }; 
} 

function Dog (name) { 
    const dog = Pet("Dog", name); 
    return Object.assign(dog, Walker(dog)); 
} 

function Parakeet (name) { 
    const parakeet = Pet("Bird", name); 
    return Object.assign(parakeet, Flyer(parakeet)); 
} 

function HarveyTheWonderHamster() { 
    const harvey = Pet("Hamster", "Harvey"); 
    return Object.assign(harvey, Walker(harvey), Flyer(harvey), Swimmer(harvey)); 
}