2016-10-10 3 views
-1

Ich benutze Code unten in Firefox, um den Prototyp zu erben Beziehung zwischen zwei Objekte.Prototyp erben von einem Objekt zu einem anderen

var a={}; 
var b={}; 

b.__proto__=a; 
a.dosomething=function(){ 
    alert ('ok'); 
}; 
b.dosomething();//ok 

aber es funktioniert nur für Firefox wegen proto nur in Firefox zur Verfügung.

In anderen Web-Browser, wenn a, b eine Konstruktorfunktion erstellt verwenden, ich

b.constructor.prototype=a; 

die inherit Beziehung festlegen können.

aber im obigen Fall ist der Konstruktor von a, b Objekt beide. Ich kann den Prototyp des Objekts nicht ändern.

Gibt es eine Möglichkeit, die vererbte Beziehung außer proto zu setzen?

Ihr Kommentar willkommen

+0

Meintest du '__proto__'? – Oriol

+0

ja, es ist __proto__ – arachide

+0

In dem obigen Code stellen Sie nicht b als Prototyp eines? Im folgenden Code warum machst du 'b.constructor.prototype = a' statt' b.prototype = a'? Auch du bist das richtige Objekt ist die Mutter Prototyp in js, ich frage nur, um das Problem besser zu verstehen. –

Antwort

1

können Sie Object.create verwenden. Es erstellt ein Objekt, dessen Prototyp das Objekt ist, das an es übergeben wird.

var a = {}; 
 
var b = Object.create(a); 
 

 
a.dosomething = function() { 
 
    alert ('ok'); 
 
}; 
 
b.dosomething(); // ok

können Sie auch Object.setPrototypeOf für Objekte verwenden, die bereits existieren. Sie sollten wirklich, wirklich sollten nicht dies tun, wenn Sie es vermeiden können. Dies führt zu ernsthaften Leistungsproblemen.

var a = {}; 
 
var b = {}; 
 

 
Object.setPrototypeOf(b, a); 
 

 
a.dosomething = function() { 
 
    alert ('ok'); 
 
}; 
 
b.dosomething(); // ok

+0

das ist nur zum Erstellen neuer b (neues Objekt), kann ich die erben Beziehung festlegen, wenn a und b vorhanden sind? – arachide

+0

@arachide Yup. Siehe meine Bearbeitung. –

+0

großartig! Danke vielmals – arachide

2

Sie den Prototyp eines bestehenden Objekts nicht ändern.

Warnung: Ändern des [[Prototype]] eines Objekts wird durch die Natur , wie moderne JavaScript-Motoren optimieren Eigenschaft zugreift, eine sehr langsamer Vorgang, in jeder Browser und JavaScript-Engine. Die Auswirkungen auf die Performance der Vererbung zu verändern sind subtil und weit verstreuten und sind einfach die Zeit in obj.__proto__ = ... Anweisung ausgegeben nicht darauf beschränkt, sondern kann auch auf jeder Code erweitern, dass Zugriff auf hat jede Objekt, dessen [[Prototype]] geändert wurde. Wenn Sie Wert auf Leistung legen, sollten Sie die Einstellung [[Prototype]] eines Objekts vermeiden. Erstellen Sie stattdessen ein neues Objekt mit der gewünschten [[Prototype]] mit Object.create().

Und wenn Sie dies tun, ist der Standard Weg Object.setPrototypeOf, nicht __proto__.

Der richtige Weg ist

var a = {}; 
 
var b = Object.create(a); 
 
a.dosomething = function(){ 
 
    console.log('ok'); 
 
}; 
 
b.dosomething();

Ihr b.constructor.prototype = a; Ansatz nutzlos ist. Wenn b eine Instanz eines Konstruktors C ist, wirkt sich dieser Code nur auf Instanzen aus, die nach der Änderung erstellt wurden, jedoch nicht auf b.

Verwandte Themen