2016-07-20 14 views
0

Ich habe gehört, dass Mehrfachvererbung in JavaScript nicht unterstützt wird.kann dieses Beispiel als Mehrfachvererbung in Javascript betrachtet werden?

Kann das folgende Beispiel als Mehrfachvererbung betrachtet werden, wenn nein dann kann jemand bitte erklären warum ...?

function A() { 
    this.a = 'a' 
}; 

function B() { 
    this.b = 'b' 
}; 

function AB() { 
    A.call(this); 
    B.call(this); 
}; 

var obj = new AB(); 
console.dir(obj); 
//Output: {a: "a", b: "b"} 
+0

1/2 :: Aus Gründen folgende ich weder die Frage prüfen, tun noch die 2 Antworten als "primär auf Meinungen basieren". Erstens ist die Frage des OPs auf ein Ziel hin geradlinig, begleitet von einem Beispiel, das ausgezeichnet gewählt wurde, weist direkt auf die Art und Weise hin, gerade in JS mit seinen Funktionen als Konstrukteure, Prototypen, die mit Konstruktoren verknüpft sind, und mit Kontext kann per Call an Funktionen delegiert und angewendet werden. (Meinung: Die Frage des OP hat es daher nicht verdient, nach unten abgestimmt zu werden, wie es geschehen ist.) ... –

+0

...2/2 :: Zweitens variiert @zzzzBov das angegebene Beispiel dreimal, um den Unterschied zwischen funktionsbasierter Objektkomposition und Konstruktor- und Prototyp-basierter Vererbung in JS darzustellen. Drittens stellen beide Antworten fest, dass Zusammensetzung als Alternative zur Mehrfachvererbung angesehen werden kann, die auch keine ungerechtfertigte Meinung ist. –

Antwort

3

Kann das folgende Beispiel werden Mehrfachvererbung betrachtet könnte helfen?

Kein

Kann jemand bitte erklären, warum?

Ihre AB (was ich C von hier aus anrufen wird) Funktion tatsächlich A erstreckt sich nicht noch es erstreckt sich B:

function A() { 
 
    this.a = 'a'; 
 
} 
 

 
function B() { 
 
    this.b = 'b'; 
 
} 
 

 
function C() { 
 
    A.call(this); 
 
    B.call(this); 
 
} 
 

 
a = new A(); 
 
console.log('a is A', a instanceof A); 
 

 
b = new B(); 
 
console.log('b is B', b instanceof B); 
 

 
c = new C(); 
 
console.log('c is A', c instanceof A, 'c is B', c instanceof B);

Sie haben noch überhaupt keine Vererbung in diesem Beispiel. Sie haben tun haben Funktionszusammensetzung.

Wenn Sie die Vererbung haben wollte, die C Funktion müsste einen Prototyp haben, die auf eine Instanz weist entweder A oder B:

function A() { 
 
    this.a = 'a'; 
 
} 
 

 
function B() { 
 
    this.b = 'b'; 
 
} 
 

 
function C() { 
 
    A.call(this); 
 
    B.call(this); 
 
} 
 

 
C.prototype = new A(); 
 
//or 
 
//C.prototype = new B(); 
 

 
a = new A(); 
 
console.log('a is A', a instanceof A); 
 

 
b = new B(); 
 
console.log('b is B', b instanceof B); 
 

 
c = new C(); 
 
console.log('c is A', c instanceof A, 'c is B', c instanceof B);

Beachten Sie, dass, weil die C Funktion Hat einen einzigen Prototyp, können Sie nur einzelne Vererbung haben.


Für Objekt Zusammensetzung, wäre es üblich, ein Muster entlang der Linien zu sehen:

function A() { 
 
    this.a = 'a'; 
 
} 
 

 
function B() { 
 
    this.b = 'b'; 
 
} 
 

 
function C() { 
 
    this.a = new A(); 
 
    this.b = new B(); 
 
} 
 

 
a = new A(); 
 
console.log('a is A', a instanceof A); 
 

 
b = new B(); 
 
console.log('b is B', b instanceof B); 
 

 
c = new C(); 
 
console.log('c.a is A', c.a instanceof A, 'c.b is B', c.b instanceof B);

+0

Vielen Dank zzzBov für Ihre Antwort und sofortige Antwort –