2011-02-23 20 views
8

Tengo un conjunto de clases de JavaScript que utilizo en toda mi aplicación. En un caso, quiero evaluar algunos json de una respuesta ajax cuya forma coincida con una de mis clases.javascript: lanzar un objeto que se ha creado con eval

Estoy usando el método jquery parseJSON para hacer la evaluación por mí.

El único problema es que ahora quiero llamar a un método definido en mi clase, pero sé que ese método no existirá en el objeto evaluado.

¿Cuál es la mejor manera de hacer que este método esté disponible en mi nuevo objeto? ¿Hay alguna manera de "lanzarlo"?

+1

Me lo he preguntado por un buen tiempo. – Kayla

+0

Eche un vistazo a [mi respuesta aquí] (http://stackoverflow.com/questions/5063558/javascript-overriden-method/5063837#5063837). Puede usar esto para extender el objeto que obtiene de JSON con el prototipo de su "clase". (o simplemente copie los datos de JSON a un objeto de su "clase" como @Box9 muestra muy bien;)) –

Respuesta

6

No hay concepto de conversión en JavaScript. En cambio, puede modificar el constructor de su clase para aceptar un objeto simple. La forma de hacerlo depende de cómo se haya configurado su clase, sino que simplemente podría implicar una copia superficial del objeto en una nueva instancia de la clase:

var MyClass = function (obj) { 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     this[i] = obj[i]; 
    } 
    // Other class initialisation code 
}; 

Entonces "fundido" su objeto como éste:

var result = new MyClass(someObject); 

Si tiene varias clases que requieren esto, es posible que prefiera para crear una función extend que hace la clonación para usted (o si estás usando jQuery, esta función ya existe):

var extend = function (obj1, obj2) { 
    for (var i in obj2) { 
     if (!obj2.hasOwnProperty(i)) continue; 
     obj1[i] = obj2[i]; 
    } 
}; 

Y luego "lanzar" de esta manera:

var result = new MyClass(); 
extend(result, someObject); 
+0

También conocido como serializar y deserializar sus objetos. – Raynos

+0

interesante, aunque no estoy seguro acerca de este bit "var result = new MyClass (someJson);" seguramente el "someJSON" deberá ser evaluado en el constructor o ya será evaluado, en cuyo caso debería llamarse "someObject". –

+0

@Raynos, en realidad no. El OP ya lo ha deserializado usando 'parseJSON'; necesita una forma de copiar esto en una instancia de alguna clase. –

Cuestiones relacionadas