2011-12-16 6 views
9

Me gustaría poner parche al constructor para este objeto 'Controlador'. ¿Pero cómo parcheo mono la función del constructor para poder llamar al original? Esto es lo que he intentado.¿Cómo ajusto el par la función de constructor de un objeto?

// original 
function Controller() { 
    this._tag = 'div'; 
} 
Controller.prototype.tag = function() { 
    console.log(this._tag); 
} 

var c = new Controller(); 
c.tag(); // -> 'div', as expected 


// patch attempt 
var original = Controller; 
Controller = function() { 
    original.apply(this); 
    this._tag = 'patched'; // patch 
} 

var c = new Controller(); 
c.tag(); // no method tag, prototype appears wiped... 
+0

El operador de agrupamiento alrededor de la expresión de la función RHS es superfluo. El "constructor" se declara dentro de otra función, por lo que no puede acceder desde el exterior (a menos que el código que falta lo haga una propiedad de la función anónima externa u otro objeto). Entonces, si quiere "parche de mono" al constructor (lo que sea que eso signifique), insertar el código donde tiene el comentario es la única manera. – RobG

+0

@RobG Si es curioso: http://en.wikipedia.org/wiki/Monkey_patch Es bastante directo al parche de mono una propiedad o método, pero debido al estado especial de las funciones del constructor no puedo. Puede estar en lo correcto al decir que esto no es posible, pero no estoy seguro de las razones por las que aún no lo ha hecho. Actualizaré la muestra del código para reflejar. –

+0

agregó una mejor muestra de código. –

Respuesta

8

Se parecen querer hacer algo como:

Constructor.prototype.oldTag = Constructor.prototype.tag; 

Constructor.prototype.tag = function() {/* whatever */}; 

Ahora todos los casos obtener el nuevo método etiqueta y aún puede llamar al oldTag si lo desea (o devolverlo).

O quizás usted quiere hacer algo como:

var oldConstructor = Constructor; 

var Constructor = function() { /* new constructor */ }; 
Constructor.prototype = oldConstructor.prototype; 

Así que ahora tiene un nuevo constructor con todos los viejos métodos. O haga las dos cosas de arriba. Solo use el inglés simple para decir lo que quiere hacer.

+0

Gracias. Hasta el momento, parece que lo que estoy tratando de hacer no es posible. –

2

La forma más limpia no es un parche en el mono constructor: poner la lógica del constructor en una init método y el mono separada parche/heredar ese lugar.

function Constructor(){ 
    this.init(); 
} 
Constructor.prototype.init = function(){ /*...*/ }; 

También puede considerar la construcción de objetos con una función de constructor

function make_fancy_obj(){ 
    var obj = new Constructor(); 
    obj.foo = 'bar'; 
    return obj; 
} 
+0

He corregido un error ortográfico, funciton se convirtió en función. No me molestes – MrBoJangles

+1

@MrBoJangles: cuando finalmente gobierne el universo, cambiaré las leyes de la física para reemplazar todas las funcitons por función. Entonces todos mis problemas serán resueltos – hugomg

+2

Desafortunadamente no tengo acceso al constructor original. Es por eso que voy por este camino. ¿Puedes hacer esto sin modificar el original en mi ejemplo? –

Cuestiones relacionadas