2012-06-13 9 views
5

Dato il seguente codice:funzioni Riapplicare JS Prototype dopo la deserializzazione

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

Il mio obiettivo sarebbe quello di essere in grado di chiamare "showFullName" su theperson. Mentre capisco che JS non ha realmente degli oggetti, deve avere un modo di essere in grado di dire che qualcosa dovrebbe essere trattato in un certo modo, come il casting di thePerson in un Person.

+1

(È più un parse che un cast, come la vedo io) – gdoron

+3

Javascript * ha * oggetti - è completamente orientato agli oggetti. Semplicemente non ha un sistema di battitura forzato, quindi puoi chiamare qualsiasi cosa su qualsiasi cosa e non sapere che hai un problema fino a tardi. Ma penso che gdoron abbia probabilmente ragione a non preservare i metodi. Hai scritto la tua stringa JSON per l'output? –

+1

È possibile farlo se l'implementazione supporta la proprietà '__proto__' non standard. 'thePerson .__ proto__ = Person.prototype'. –

risposta

2

Per quanto ne so, il modo migliore per farlo consiste nel costruire prima un oggetto vaniglia e poi inserire i dati su di esso usando qualcosa come jQuery extend, es.

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

Come accennato in seguito, non è necessario utilizzare extend se si sta creando solo una copia, che tu sei qui. Puoi semplicemente scorrere le proprietà dei dati analizzati e copiarli sull'oggetto di destinazione.

+0

Friggin fantastico !!! Questo funziona. Mentre odio rendere la cache dipendente da JQuery, questo funziona. Non appena posso accettare la risposta, lo farò – xximjasonxx

+0

C'è qualcosa nel JS nativo che è simile a questo? Solo per curiosità – xximjasonxx

+0

grandiosa, eccetto che la domanda riguarda javascript, non jquery. Non tutti usano jquery. – hvgotcodes

2

È impossibile.

Non è possibile convertire una stringa JSON in un oggetto con i metodi precedenti.

0

Mentre capisco che JS in realtà non hanno oggetti, deve avere qualche modo di essere in grado di dire qualcosa deve essere trattato un certo modo.

Non corretto. Ci sono molti oggetti in JS; Le funzioni stesse sono oggetti. AFAIK le uniche cose che NON sono oggetti sono i tipi primitivi. Forse quello che intendi dire è che Javascript non ha idea di una classe . Sarebbe corretto, poiché JS utilizza l'ereditarietà prototipale.

In senso generale, il casting non ha senso in JS. Se lo fai

x.someMethod()

someMethod scatterà se è definito sulla x, non importa quale tipo x è. Si chiama duck typing.

JSON.parse crea un object literal. Il meglio che puoi fare è creare un costruttore che accetta un oggetto letterale e inizializza i valori della tua istanza.

+0

Potrebbe essere solo una mia preferenza personale, ma non contengo gli "oggetti soft" in JS come oggetti , ma è probabile che il mio pregiudizio verso le lingue OO reali che mostrano – xximjasonxx

+0

js sia un vero linguaggio OO. Solo perché tu capisci solo OO nel contesto dell'eredità classica non significa che non ci siano altre cose là fuori. Cosa intendi per "oggetti morbidi"? JS ha oggetti reali. – hvgotcodes

+0

Un'altra volta per quel dibattito :) – xximjasonxx

0

È possibile creare una sorta di classe wrapper che è possibile alimentare un oggetto al costruttore e imposterà ciascuna proprietà come proprietà di tale oggetto. Si potrebbe fare di una 'base' in modo da poterla usare per tutti i tipi di oggetti. In questo modo, dovresti solo creare una nuova istanza della classe che "eredita" da quella baseclass e alimentarla con l'oggetto. Un po 'come i modelli usati in http://backbonejs.org/

2

Come la maggior parte delle cose che hanno costrutti linguistici in altre lingue, anche se non è possibile farlo direttamente, c'è un modo per aggirarlo in Javascript.Basta impostare il vostro oggetto per accettare tutti i dati che espone come un costruttore:

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

da zero:

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

(nb - si potrebbe usare $.extend o simili per aggiornare un'istanza esistente invece - ma generalmente è preferibile utilizzare il costruttore in modo da avere il controllo sulla gestione dell'oggetto che viene passato, ad esempio si potrebbe voler ignorare tutto tranne alcune proprietà dell'oggetto che è passato dentro).

Problemi correlati