2012-04-11 16 views
5

tengo esta JavaScript:¿Cómo envuelvo un constructor?

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

var t = new Type(); 

Ahora quiero añadir lo siguiente:

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

Así que puedo hacer:

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

assertEquals(1, t.extraField); 

[EDIT] me gustaría una propiedad de instancia, no una propiedad de clase (estática/compartida).

El código ejecutado en la función de envoltura debería funcionar como si lo hubiera pegado en el constructor real.

El tipo de Type no debe cambiar.

+1

Por lo que entiendo, ¿desea agregar una propiedad adicional al constructor? ¿para que nuevas instancias tengan esa propiedad? – Joseph

+0

Puede ser que necesite simplemente cambiar el prototipo de 'Tipo' dentro de la función' wrap() '. Por ejemplo: 'var wrap = function (cls) {cls.prototype.extraField = 1; }; '? ¿O puede ser mejor crear un nuevo 'Type2' heredado de' Type' con un miembro 'extraField' adicional? –

+0

¿Puedes describir tu problema con más detalle? – seteh

Respuesta

5

actualización: An updated version here

lo que realmente se busca extender Tipo de otra clase. Hay muchas formas de hacerlo en JavaScript. No soy muy fan de la new y los prototype métodos de construcción "clases" (prefiero el estilo herencia parasitaria mejor), pero aquí es lo que tengo:

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

Desde su salida de consola, me gustaría extender la función almacenada en 'constructor'. El nuevo campo debería aparecer junto a 'name', no al lado de' constructor'. –

+0

entonces, ¿qué es lo que realmente quieres hacer es crear otro constructor? o simplemente agregar a la existente? – Joseph

+0

Quiero extender el constructor existente. –

0

no sé cómo hacerlo es la forma en que sugirió, aunque admito que me interesaría. Solo puedo pensar en reasignar la variable Tipo a una función de envoltura como esta:

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); 
Cuestiones relacionadas