2012-04-11 7 views
5

J'ai ce JavaScript:Comment emballer un constructeur?

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

var t = new Type(); 

Maintenant, je veux ajouter ceci:

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

Je peux faire:

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

assertEquals(1, t.extraField); 

[EDIT] Je voudrais une propriété d'instance, pas une propriété de classe (statique/partagée).

Le code exécuté dans la fonction wrapper devrait fonctionner comme si je l'avais collé dans le constructeur réel.

Le type de Type ne doit pas changer.

+1

D'après ce que je comprends, vous voulez ajouter une propriété supplémentaire au constructeur? de sorte que d'autres nouvelles instances ont cette propriété? – Joseph

+0

Peut être vous avez simplement besoin de changer le prototype de 'Type' dans la fonction' wrap() '. Par exemple: 'var wrap = fonction (cls) {cls.prototype.extraField = 1; }; '? Ou peut-être est-il préférable de créer un nouveau 'Type2' hérité de' Type' avec un autre membre 'extraField'? –

+0

Pouvez-vous décrire votre problème plus en détail? – seteh

Répondre

5

mise à jour: An updated version here

ce que vous recherchez réellement pour élargissait type dans une autre classe. Il y a beaucoup de façons de le faire en JavaScript. Je ne suis pas vraiment fan de la new et les méthodes de prototype construire « classes » (je préfère le style d'héritage parasite mieux), mais voici ce que je suis:

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

De votre sortie de console, je voudrais étendre la fonction stockée dans 'constructor'. Le nouveau champ devrait apparaître à côté de 'name', pas à côté de' constructor'. –

+0

alors ce que vous voulez vraiment faire est de créer un autre constructeur? ou simplement ajouter à l'existant? – Joseph

+0

Je veux étendre le constructeur existant. –

0

Je ne sais pas comment faire comme vous l'avez suggéré, bien que j'admette que cela m'intéresserait. Je ne peux penser à réattribuer la variable Type à une fonction wrapper comme ceci:

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); 
Questions connexes