2012-04-06 7 views
0

In Javascript, wenn ich brauche jede Objekte einen individuellen Wert eines Attributs haben, ich kann es nur im Konstruktor gesetzt, etwa so:Sharing-Attribute für Gruppen von Objekten in Javascript

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

Wenn ich will bestimmtes Attribut, das unter den Objekten geteilt wird, kann ich es im Prototyp der Konstruktorfunktion einstellen.

function B() {} 
B.prototype.b = 'B0'; 

Aber was in Zwischensituation zu tun? Grundsätzlich habe ich einen existierenden Code, bei dem alle konstruierten Objekte eine Eigenschaft von einem Prototyp erben, aber jetzt muss ich sie in mehrere Gruppen aufteilen, so dass alle Mitglieder einer Gruppe ein Attribut teilen.

Gibt es eine Möglichkeit, die Konstruktorfunktion B irgendwie zu spezialisieren?

Antwort

1

B.prototype.b erstellt KEINE statische Eigenschaft, wie Sie vermuten. Es ist ein bisschen komplizierter als das, angefügten Eigenschaften ihren Wert mit anderen Instanzen auf einen Prototyp zu teilen, bis sie diesen Wert überschreiben, was bedeutet, dass:

var Foo = function(){ 
}; 
Foo.prototype.bar = 'bar'; 

var f1 = new Foo(); 
console.log(f1.bar); //outputs 'bar' 
var f2 = new Foo(); 
console.log(f2.bar); //outputs 'bar' 

f2.bar = 'notbar'; 
console.log(f2.bar); //outputs 'notbar' 
console.log(f1.bar); //outputs 'bar' 

Der einzige Weg, „echte“ statische Eigenschaften zu haben, um sie zu befestigen selbst an den Konstruktor Funktion:

Foo.bar2 = 'bar2'; 

Instanzen Foo wird dieser Wert mit Foo.bar2 zugreifen müssen.

Also die Antwort auf Ihre Frage lautet: „Unterklassen“ (Konstruktorfunktionen, die ihren Prototyp aus einer Basiskonstruktor Funktion erben) zu erstellen, für jede Gruppe und fügen Sie eine Eigenschaft pro Unterklasse, wie folgt aus:

var Base = function(){ 
}; 
Base.prototype.getSomething = function(){ 
    return this.constructor.something; 
}; 
Base.prototype.setSomething = function(value){ 
    this.constructor.something = value; 
} 
var Group1 = function(){ 
}; 
Group1.prototype = new Base(); //classical inheritance 
Group1.prototype.constructor = Group1; 
Group1.something = 'something'; 
var Group2 = function(){ 
}; 
Group2.prototype = new Base(); //classical inheritance 
Group2.prototype.constructor = Group2; 
Group2.something = 'something else'; 

var g1a = new Group1(); 
var g1b = new Group1(); 
var g2a = new Group2(); 
var g2b = new Group2(); 

g1a.setSomething('whatever'); 

console.log(g1a.getSomething()); //outputs 'whatever' 
console.log(g1b.getSomething()); //outputs 'whatever' 
console.log(g2a.getSomething()); //outputs 'something else' 
console.log(g2b.getSomething()); //outputs 'something else' 

Warning : Group1.prototype = new Base(); wirklich schlechte Praxis ist, schrieb ich vor einem Blog-Post über 3 Arten von Vererbung nur wenigen Tagen weshalb erklärt:

http://creynders.wordpress.com/2012/04/01/demiurge-3-types-of-javascript-inheritance-2/

+0

Great! Was aber, wenn meine Konstruktoren tatsächlich Argumente haben? –

+0

Was genau meinst du? Group1 und Group2 sind normale Konstruktoren, die Argumente haben können. Wenn sie den Superkonstruktor aufrufen müssen, können sie ihn entweder direkt wie folgt aufrufen: 'Base.call (this) 'oder Sie können den' __super__' Trick wie in meinem Blogpost ausführen. – Creynders