2012-04-11 28 views
5

Ich habe dieses JavaScript:Wie wickle ich einen Konstruktor?

var Type = function(name) { 
    this.name = name; 
}; 

var t = new Type(); 

Nun ist diese Ich möchte hinzufügen: ich tun kann

var wrap = function(cls) { 
    // ... wrap constructor of Type ... 
    this.extraField = 1; 
}; 

So:

wrap(Type); 
var t = new Type(); 

assertEquals(1, t.extraField); 

[EDIT] Ich möchte ein Instanzeigenschaft, keine Klasseneigenschaft (statisch/gemeinsam).

Der in der Wrapper-Funktion ausgeführte Code sollte so funktionieren, als hätte ich ihn in den echten Konstruktor eingefügt.

Der Typ Type sollte nicht geändert werden.

+1

Mit dem was ich verstehe, möchten Sie dem Konstruktor eine zusätzliche Eigenschaft hinzufügen? so dass weitere neue Instanzen diese Eigenschaft haben? – Joseph

+0

Möglicherweise müssen Sie einfach den Prototyp der 'Type' innerhalb der' wrap() 'Funktion ändern. Zum Beispiel: 'var wrap = Funktion (cls) {cls.prototype.extraField = 1; }; '? Oder ist es am besten, neue 'Type2' zu erstellen, die von' Type' mit einem zusätzlichen 'extraField'-Member geerbt werden? –

+0

Können Sie Ihr Problem genauer beschreiben? – seteh

Antwort

5

Update: An updated version here

, was Sie eigentlich auf der Suche nach wurde Type in eine andere Klasse erstreckt. Es gibt viele Möglichkeiten, das in JavaScript zu tun. Ich bin nicht wirklich ein Fan des new und die prototype Bauweisen „Klassen“ (Ich ziehe den parasitären Erbe Stil besser), aber hier ist, was ich habe:

//your original class 
var Type = function(name) { 
    this.name = name; 
}; 

//our extend function 
var extend = function(cls) { 

    //which returns a constructor 
    function foo() { 

     //that calls the parent constructor with itself as scope 
     cls.apply(this, arguments) 

     //the additional field 
     this.extraField = 1; 
    } 

    //make the prototype an instance of the old class 
    foo.prototype = Object.create(cls.prototype); 

    return foo; 
}; 

//so lets extend Type into newType 
var newType = extend(Type); 

//create an instance of newType and old Type 
var t = new Type('bar'); 
var n = new newType('foo'); 


console.log(t); 
console.log(t instanceof Type); 
console.log(n); 
console.log(n instanceof newType); 
console.log(n instanceof Type); 
+0

Von Ihrer Konsolenausgabe möchte ich die Funktion erweitern, die in 'Konstruktor' gespeichert ist. Das neue Feld sollte neben 'name', nicht neben' constructor' erscheinen. –

+0

also, was Sie wirklich tun möchten, ist ein anderer Konstruktor erstellen? oder einfach zum bestehenden hinzufügen? – Joseph

+0

Ich möchte den vorhandenen Konstruktor erweitern. –

0

Ich weiß nicht, wie zu tun Es ist so, wie du es vorgeschlagen hast, obwohl ich zugeben würde, dass es mich interessieren würde. Ich kann nur daran denken, die Type-Variable einer Wrapper-Funktion wie dieser neu zuzuweisen:

var wrap = function(name) 
{ 
    Type.prototype.constructor.call(this, name); 
    this.extraField = 1; 
}; 
wrap.prototype = Type.prototype; 
Type = wrap; 

var t = new Type(); 
assertEquals(1, t.extraField); 
Verwandte Themen