2012-06-13 18 views
5

Dado el siguiente código:funciones JS Prototype después de deserialización

function Person(firstName, lastName) { 
    this.FirstName = firstName; 
    this.LastName = lastName; 
} 

Person.prototype.showFullName = function() { 
    return this.FirstName + " " + this.LastName; 
}; 

var person = new Person("xx", "xxxx"); 
var jsonString = JSON.stringify(person); 

var thePerson = JSON.parse(jsonString); 

Mi objetivo aquí sería ser capaz de llamar "showFullName" en theperson. Aunque entiendo que JS realmente no tiene objetos, debe tener alguna forma de poder decir que algo debe tratarse de cierta manera, como enviar thePerson a Person.

+1

(Es más analizar que en el molde, como lo veo) – gdoron

+3

Javascript * does * have objects - está completamente orientado a objetos. Simplemente no tiene un sistema de escritura forzada, por lo que puede llamar cualquier cosa y no saber que tiene un problema hasta más adelante. Pero creo que Gdoron probablemente tenga razón sobre no preservar los métodos. ¿Has escrito tu cadena JSON en la salida? –

+1

Puede hacerlo si la implementación es compatible con la propiedad '__proto__' no estándar. 'thePerson .__ proto__ = Person.prototype'. –

Respuesta

2

Que yo sepa, la mejor manera de hacerlo es construir primero un objeto común y luego colocar los datos en él usando algo como jQuery's extend, es decir.

var thePerson = new Person(); // and make sure the constructor gracefully handles no arguments 
jQuery.extend(thePerson, JSON.parse(stringData)); 

Como se menciona más adelante, no es necesario utilizar extend si sólo está creando una copia superficial, lo que usted está aquí. Puede recorrer las propiedades de los datos analizados y copiarlos en su objeto de destino.

+0

Friggin awesome !!! Esto funciona. Aunque odio que mi caché dependa de JQuery, esto funciona. Tan pronto como pueda aceptar la respuesta, lo haré – xximjasonxx

+0

¿Hay algo en JS nativo que sea similar a esto? Solo por curiosidad – xximjasonxx

+0

genial, excepto que la pregunta es sobre javascript, no jquery. No todos usan jquery. – hvgotcodes

2

Es imposible.

No se puede convertir una cadena JSON en un objeto con sus métodos anteriores.

0

Si bien entiendo que JS no tiene realmente objetos, debe tener alguna manera de poder decir algo debe ser tratado de una manera determinada .

No es correcto. Hay muchos objetos en JS; Las funciones mismas son objetos. AFAIK las únicas cosas que NO son objetos son los tipos primitivos. Tal vez lo que quieres decir es que Javascript no tiene noción de una clase . Eso sería correcto, ya que JS usa herencia prototípica.

En el sentido general, la fundición no tiene sentido en JS. Si lo hace

x.someMethod()

algunMetodo se disparará si se define en x, no importa qué tipo es x. Se llama tipa de pato.

crea object literal. Lo mejor que puede hacer es crear un constructor que tome un objeto literal e inicialice los valores de su instancia.

+0

Podría ser solo mi preferencia personal, pero no cuento los "objetos blandos" en JS como objetos , pero es probable que mi sesgo hacia los lenguajes OO reales que muestran – xximjasonxx

+0

js es un verdadero lenguaje OO. El hecho de que solo comprenda OO en el contexto de la herencia clásica no significa que no haya otras cosas por ahí. ¿Qué quieres decir con "objetos suaves"? JS tiene objetos reales. – hvgotcodes

+0

Otra vez para ese debate :) – xximjasonxx

0

Puede crear un tipo de clase contenedora que pueda alimentar un objeto al constructor y establecerá cada propiedad como una propiedad de ese objeto. Podrías hacer de esto una 'clase base' para que puedas usarla para todo tipo de objetos. De esta forma, solo tendrías que crear una nueva instancia de la clase que "hereda" de esa clase base y alimentarlo con tu objeto. Tipo de modelos similares a los utilizados en http://backbonejs.org/

2

Como la mayoría de las cosas que tienen construcciones de lenguaje en otros idiomas, aunque no se puede hacer directamente, hay una forma de evitarlo en Javascript.Sólo tienes que configurar el objeto de aceptar todos los datos que expone como constructor:

var data = JSON.parse(jsonString); 
var person = new Person(data); 

desde cero:

var person = new Person({ FirstName: "xx", LastName: "xxx"}); 

(NB - se puede utilizar $.extend o similar para actualizar una instancia existente lugar - pero, en general, es preferible usar el constructor para que tenga control sobre el manejo del objeto que se transfiere, por ejemplo, puede desear ignorar todos, excepto ciertas propiedades del objeto que se transfiere).

Cuestiones relacionadas