2012-04-11 15 views
5

Ho questa JavaScript:Come si avvolge un costruttore?

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

var t = new Type(); 

Ora voglio aggiungere questo:

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

Così posso fare:

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

assertEquals(1, t.extraField); 

[EDIT] mi piacerebbe un proprietà instance, non una proprietà class (static/shared).

Il codice eseguito nella funzione wrapper dovrebbe funzionare come se l'avessi incollato nel costruttore reale.

Il tipo di Type non deve essere modificato.

+1

Da quello che ho capito, vuoi aggiungere una proprietà aggiuntiva al costruttore? in modo che ulteriori nuove istanze abbiano quella proprietà? – Joseph

+0

Potrebbe essere necessario cambiare semplicemente il prototipo di 'Type' all'interno della funzione' wrap() '. Ad esempio: 'var wrap = function (cls) {cls.prototype.extraField = 1; }; '? O forse è meglio creare un nuovo 'Tipo2' ereditato da' Tipo' con un membro aggiuntivo 'extraField'? –

+0

Puoi descrivere il tuo problema più dettagliatamente? – seteh

risposta

5

aggiornamento: An updated version here

quello che in realtà è stato alla ricerca di estendere tipo in un'altra classe. Ci sono molti modi per farlo in JavaScript. Io non sono davvero un fan della new e le prototype metodi di costruzione di "classi" (io preferisco lo stile di eredità parassitaria meglio), ma ecco quello che ho ottenuto:

//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

Dall'uscita della console, mi piacerebbe estendere la funzione memorizzata in 'costruttore '. Il nuovo campo dovrebbe apparire accanto a 'name', non accanto a' constructor'. –

+0

quindi quello che vuoi veramente fare è creare un altro costruttore? o semplicemente aggiungere al esistente? – Joseph

+0

Voglio estendere il costruttore esistente. –

0

non so come fare come hai suggerito, anche se ammetto che mi interesserebbe. Posso solo pensare di riassegnare la variabile Type a una funzione wrapper come questa:

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); 
Problemi correlati