2011-09-02 13 views
8

Estoy en un territorio nuevo ahora, no he trabajado con este tipo de cosas en mucho tiempo.¿Extender una función - fusionar dos funciones?

¿Cuál es la mejor manera de tener una 'clase' Javascript, por ejemplo,

// In the parent instance 
function xyz() 
{ 
    var x = 1; 
} 

Quiero configurar esto en la clase, y cuando un usuario se extiende una clase, yo quiero que sean efectivamente extender este función. Sé que no estoy siendo claro, pero ha sido un día largo. Este es el código del usuario, por ejemplo.

// In the child instance 
function xyz() 
{ 
    var y = 2; 
} 

La fusión debe dar lugar a:

// In the merged instance 
function xyz() 
{ 
    var x = 1; 
    var y = 2; 
} 

Am I fumar las cosas mal o haciendo la pregunta equivocada?

+2

Por favor, sigan fumando lo mismo :) – JoeyC

Respuesta

8

No puede 'fusionar' funciones tal como las describe allí, pero lo que puede hacer es redefinir una función para llamar a sí mismo y a una nueva función (antes o después del original).

var xyz = function(){ 
    console.log('xyz'); 
}; 

var abc = function(){ 
    console.log('abc'); 
}; 

// and, elsewhere, if you want to merge: 
var orig = abc; 
abc = function(){ 
    orig.call(this, arguments); 
    xyz.call(this, arguments); 
}; 

La inclusión de (esto, los argumentos) no es necesario si no se preocupan por el contexto de ejecución o si la función llamada es sin parámetros. Pero lo incluí para mayor claridad de lo que se podría hacer si quisiera un método parametrizado.

8

Usted etiqueta la pregunta con jquery, entonces supongo que usa jquery. con jquery, podría fusionar objetos con jQuery.extend().

var object1 = { 
    apple: 0, 
    banana: {weight: 52, price: 100}, 
    cherry: 97 
}; 
var object2 = { 
    banana: {price: 200}, 
    durian: 100 
}; 

/* merge object2 into object1 */ 
$.extend(object1, object2); 

o usa la cadena de prototipos para implementar la herencia. por ejemplo:

function a() { 
    this.t1 = 1; 
    this.sayMyName = function() { 
     alert('a'); 
    } 
} 
b.prototype = new a; 
b.prototype.constructor = b; 
function b() { 
    this.t2 = 2; 
    this.sayMyName = function() { 
     alert('b'); 
    } 
} 
var obj = new b(); 
alert(obj.t1); // this would say 1 
obj.sayMyName(); // this would say b 
+0

La cadena de prototipos es lo que me interesa, hice algunas lecturas rápidas sobre creación de prototipos, pero no entró en funciones. ¿Conoces alguna buena lectura para esto? –

+0

Existen múltiples formas de implementar clase/herencia en javascript. aquí hay algunos artículos sobre javascript orientado objetada. [3 formas de definir una clase de JavaScript] (http://www.phpied.com/3-ways-to-define-a-javascript-class/) [Programación orientada a objetos en JavaScript] (http://mckoss.com /jscript/object.htm) [Herencia clásica en JavaScript] (http://www.crockford.com/javascript/inheritance.html) Espero que esta ayuda :) – ntangjee

0

Si he entendido bien, puede intentar cambiar el nombre de la función original y decir que es dentro de la nueva función:

// In the parent instance 
function xyz() 
{ 
    var x = 1; 
} 

// In the child instance 
var old_xyz = xyz; 
function xyz() 
{ 
    var y = 2; 
    old_xyz(); 
} 

También funciona con clase/método de la herencia:

MyClass.prototype.old_xyz = MyClass.prototype.xyz; 
MyClass.prototype.xyz = function() { 
    this.old_xyz(); 
}