2012-06-13 13 views
5

den folgenden Code Gegeben:Reapply JS Prototype-Funktionen nach der Deserialisierung

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

Mein Ziel hier wäre in der Lage sein "showFullName" auf theperson zu nennen. Während ich verstehe, dass JS nicht wirklich Objekte hat, muss es eine Möglichkeit haben, etwas sagen zu können, sollte auf eine bestimmte Art und Weise behandelt werden, wie zum Beispiel thePerson zu einem Person Casting.

+1

(Es ist mehr Parse als Cast, wie ich es sehe) – gdoron

+3

Javascript * hat * Objekte - es ist vollständig objektorientiert. Es hat einfach kein stark erzwungenes Schreibsystem, so dass Sie alles über etwas anrufen können und nicht wissen, dass Sie ein Problem haben, bis später. Aber ich denke, Gdoron ist wahrscheinlich richtig, wenn es darum geht, Methoden nicht zu konservieren. Haben Sie Ihre JSON-Zeichenfolge zur Ausgabe geschrieben? –

+1

Sie können es tun, wenn die Implementierung die nicht standardmäßige '__proto__'-Eigenschaft unterstützt. 'thePerson.__ proto__ = Person.prototype'. –

Antwort

2

Nach meinem Wissen ist der beste Weg, dies zu tun, zuerst ein Vanilla-Objekt zu konstruieren und dann die Daten mit etwas wie jQuerys extend, dh.

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

Wie weiter unten erwähnt, brauchen Sie nicht extend verwenden, wenn Sie nur eine flache Kopie erstellen, die Sie hier sind. Sie können einfach die Eigenschaften der analysierten Daten durchlaufen und sie auf Ihr Zielobjekt kopieren.

+0

Friggin genial !!! Das funktioniert. Während ich hasse, meinen Cache auf JQuery angewiesen zu machen, funktioniert das. Sobald ich die Antwort annehmen kann, werde ich – xximjasonxx

+0

Gibt es etwas in nativem JS, das dem ähnlich ist? Nur aus Neugier – xximjasonxx

+0

groß, außer die Frage ist über Javascript, nicht jquery. Nicht jeder benutzt jQuery. – hvgotcodes

2

Es ist unmöglich.

Sie können eine JSON-Zeichenfolge mit den vorherigen Methoden nicht in ein Objekt konvertieren.

0

Während ich verstehe, dass JS wirklich keine Objekte hat, muss es einen Weg der Lage zu sein, etwas zu sagen, sollte eine gewisse Art und Weise behandelt werden.

Nicht korrekt. Es gibt viele Objekte in JS; Funktionen selbst sind Objekte. AFAIK die einzigen Dinge, die keine Objekte sind, sind primitive Typen. Vielleicht, was Sie sagen wollen, ist, dass Javascript keine Ahnung von Klasse hat. Das wäre richtig, da JS die prototypische Vererbung verwendet.

Im allgemeinen Sinn macht Gießen in JS keinen Sinn. Wenn Sie das tun

x.someMethod()

irgendeinemethode wird ausgelöst, wenn es auf x definiert ist, egal welche Art x ist. Es heißt Ente tippen.

JSON.parse erstellt eine object literal. Das Beste, was Sie tun können, ist einen Konstruktor zu erstellen, der ein Objekt-Literal übernimmt und die Werte Ihrer Instanz initialisiert.

+0

Es könnte nur meine persönliche Präferenz sein, aber ich zähle nicht die "weichen Objekte" in JS als Objekte , aber das ist wahrscheinlich meine Voreingenommenheit gegenüber echten OO-Sprachen, die – xximjasonxx

+0

js ist eine echte OO-Sprache. Nur weil du OO nur im Kontext der klassischen Vererbung verstehst, heißt das nicht, dass es da draußen keine anderen Dinge gibt. Was meinst du mit "weichen Objekten"? JS hat echte Objekte. – hvgotcodes

+0

Eine andere Zeit für diese Debatte :) – xximjasonxx

0

Sie können eine Art Wrapper-Klasse erstellen, der Sie ein Objekt an den Konstruktor übergeben können, und jede Eigenschaft wird als eine Eigenschaft dieses Objekts festgelegt. Sie können dies zu einer Basisklasse machen, damit Sie sie für alle Arten von Objekten verwenden können. Auf diese Weise müssten Sie nur eine neue Instanz der Klasse erstellen, die von dieser Basisklasse "erbt" und sie mit Ihrem Objekt füttern. So wie Modelle in http://backbonejs.org/

2

Wie die meisten Dinge, die Sprachkonstrukte in anderen Sprachen haben, obwohl Sie es nicht direkt tun können, gibt es einen Weg um es in Javascript.Gerade richten Sie Ihr Objekt alle Daten zu akzeptieren, es als Konstrukteur macht:

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

von Grund auf:

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

(nb - Sie stattdessen $.extend oder dergleichen zu aktualisieren eine vorhandene Instanz nutzen könnten - Im Allgemeinen ist es jedoch vorzuziehen, den Konstruktor zu verwenden, damit Sie die Handhabung des Objekts, das übergeben wird, kontrollieren können, beispielsweise möchten Sie alle außer bestimmten Eigenschaften des übergebenen Objekts ignorieren.

Verwandte Themen