Diciamo che ricevo alcuni oggetti JSON dal mio server, ad es. alcuni dati per un oggetto Person:Come aggiungere metodi a un prototipo di un oggetto (JSON)?
{firstName: "Bjarne", lastName: "Fisk"}
Ora, voglio alcuni metodi in cima a tali dati, per esempio per il calcolo del fullName:
fullName: function() { return this.firstName + " " + this.lastName; }
In modo che posso
var personData = {firstName: "Bjarne", lastName: "Fisk"};
var person = PROFIT(personData);
person.fullName(); // => "Bjarne Fisk"
Quello che fondamentalmente vorrei fare qui, è quello di aggiungere un metodo per il prototipo dell'oggetto. Il metodo fullName()
è generale, quindi non deve essere aggiunto all'oggetto dati stesso. Come ..:
personData.fullName = function() { return this.firstName + " " + this.lastName; }
... causerebbe un sacco di ridondanza; e probabilmente "inquinano" l'oggetto dati.
Qual è l'attuale modo migliore di aggiungere tali metodi a un semplice oggetto dati?
EDIT:
Leggermente fuori tema, ma se il problema di cui sopra può essere risolto, sarebbe possibile fare qualche bella pseudo pattern matching
come questo:
if (p = Person(data)) {
console.log(p.fullName());
} else if (d = Dog(data)) {
console.log("I'm a dog lol. Hear me bark: "+d.bark());
} else {
throw new Exception("Shitty object");
}
Person
e Dog
sarà aggiungere i metodi se l'oggetto data
ha gli attributi corretti. In caso contrario, restituire false (ad esempio, i dati non corrispondono a non corrispondono a corrispondenza/conformità).
DOMANDA BONUS: Qualcuno sa di una libreria che utilizza o abilita questo (cioè lo rende facile)? È già uno schema javascript? Se è così, come è chiamato; e hai un link che elabora? Grazie :)
Non dovresti già sapere che tipo di oggetto è quando stai recuperando i dati JSON? Sarebbe certamente possibile creare una libreria di base per la costruzione di oggetti che faccia ciò che stai suggerendo, sembra proprio come rilevare il tipo di oggetto basato sulle proprietà non è il modo migliore per farlo ... soprattutto perché possono avere diversi tipi proprietà con nomi simili. Perché non avere solo un metodo '' JSON' o una funzione di costruzione che ha semplicemente ignorato le proprietà che non erano state definite dal costruttore? –
@MattB: Posso immaginare la funzione parseJson che accetta la stringa e la mappa percorso/protoclasse per assegnare classi agli oggetti su costruzioni. Il _path_ qui potrebbe essere ad esempio l'espressione JsonPath: http://goessner.net/articles/JsonPath/ –
Hmm, i percorsi vengono comunemente utilizzati dai framework di associazione dei dati Javascript per associare una proprietà dell'oggetto a qualcosa nell'HTML, ma io Non sono sicuro del motivo per cui avresti bisogno di usarli per la costruzione di oggetti poiché la maggior parte dei linguaggi sul lato server ora ha la possibilità di serializzare su JSON. –