Gibt es eine einfache Syntax, mit der wir person1 in ein Objekt vom Typ Person umwandeln können?
Es gibt kein Casting in JavaScript, also … kurze Antwort ist nein. Längere Antwort ist … immer noch nein. Dies liegt daran, dass die [[prototype]]kann nur gesetzt werden, wenn ein Objekt erstellt wird. Man kann jedoch Methoden/Eigenschaften von Person zu Person1 affenpatchen (kopieren), was ohnehin ein Ansatz ist, der von einigen “Klassen-Frameworks” verwendet wird. Ich würde wahrscheinlich nur eine erstellen Neu Person von person1 in einem “Kopierkonstruktor”.
– Benutzer166390
5. Januar 2012 um 2:28 Uhr
A1rPun
Die Antwort von @PeterOlson mag früher bearbeitet worden sein, aber es sieht so aus Object.create ist geändert. Ich würde mich für den Copy-Constructor-Weg entscheiden, wie @user166390 in den Kommentaren sagte.
Der Grund, warum ich diesen Beitrag nekromant habe, ist, dass ich eine solche Implementierung brauchte.
Heutzutage können wir verwenden Object.assign (Credits für die @SayanPal-Lösung) & ES6-Syntax:
class Person {
constructor(obj) {
obj && Object.assign(this, obj);
}
getFullName() {
return `${this.lastName} ${this.firstName}`;
}
}
Verwendungszweck:
const newPerson = new Person(person1)
newPerson.getFullName() // -> Freeman Gordon
ES5-Antwort unten
function Person(obj) {
for(var prop in obj){
// for safety you can use the hasOwnProperty function
this[prop] = obj[prop];
}
}
Verwendungszweck:
var newPerson = new Person(person1);
console.log(newPerson.getFullName()); // -> Freeman Gordon
Unter Verwendung einer kürzeren Version, 1,5 Liner:
function Person(){
if(arguments[0]) for(var prop in arguments[0]) this[prop] = arguments[0][prop];
}
Requisiten für die “1,5-Liner” -Version, liebe es.
– Ben Gilde
3. November 2016 um 13:45 Uhr
Aber diese Antwort ist eigentlich nur das Schreiben extend Funktion haben die meisten Frameworks drin… Und Object.assign ist der Ersatz für diese Funktion … Stand heute. nur Internet Explorer und Safari <= 9 unterstützen es nicht. Was ich tun würde, ist ein greifen Objekt.polyfill zuweisen und verwenden Sie es, wenn die echte Object.assign nicht vorhanden ist. In meinem Projekt habe ich einen Code, der die benötigten Funktionen überprüft und, falls vorhanden, ein zweites Skript mit Polyfills für diese Funktionen lädt.
– Stijn de Witt
31. Januar 2017 um 12:00 Uhr
@StijndeWitt Ich muss der Verwendung zustimmen Object.assign über diese Lösung. Sehen Sie sich die Lösung von @SayanPal an, die die Methode „assign“ verwendet. Ich werde diese Antwort irgendwann aktualisieren;)
– A1rPun
2. Februar 2017 um 12:57 Uhr
@StijndeWitt Die Zeit, meine Antwort zu aktualisieren, ist gekommen! Ich habe die Kraft von gesehen Object.assign
– A1rPun
5. September 2017 um 14:01 Uhr
Ich mag die Frage nicht. JS verwendet keine Klassen oder Castings, es verwendet Funktionen zum Erstellen von Objekten – Konstruktoren –, es verwendet Prototypen anstelle von Klassen. Ich mag den Object.assign-Ansatz, bei dem es sich um eine Funktion handelt, die die Eigenschaften von einem Objekt auf ein anderes kopiert. Ich möchte sagen, dass Sie manchmal nur den @type brauchen, sehen Sie JSDoc.
– DuniC
1. April um 18:40 Uhr
Adam Rackis
Nein.
Aber wenn Sie Ihre behandeln möchten person1 Objekt, als wäre es a Personkönnen Sie Methoden aufrufen Person‘s Prototyp auf person1 mit call:
Dies funktioniert jedoch offensichtlich nicht für privilegierte Methoden, die innerhalb des Person-Konstruktors erstellt wurden – wie Ihre getFullName Methode.
Sayan Kumpel
Dies ist nicht gerade eine Antwort, sondern ich teile eher meine Ergebnisse und bekomme hoffentlich ein kritisches Argument dafür / dagegen, da ich mir nicht bewusst bin, wie effizient es ist.
Ich musste dies kürzlich für mein Projekt tun. Ich habe das mit gemacht Object.assigngenauer gesagt wird es so gemacht:Object.assign(new Person(...), anObjectLikePerson).
Hier ist der Link zu meiner JSFiddleund auch der Hauptteil des Codes:
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.getFullName = function() {
return this.lastName + ' ' + this.firstName;
}
}
var persons = [{
lastName: "Freeman",
firstName: "Gordon"
}, {
lastName: "Smith",
firstName: "John"
}];
var stronglyTypedPersons = [];
for (var i = 0; i < persons.length; i++) {
stronglyTypedPersons.push(Object.assign(new Person("", ""), persons[i]));
}
Dies ist die beste Antwort. Die Unterschiede zwischen Assign() und Create() sind 1) Zuweisen von Werken mit Nicht-Objekt-Eigenschaften; 2) Zuweisen ignoriert unbekannte Eigenschaften.
– Stefan D
18. Februar 2017 um 19:34 Uhr
Dies entlehnt sich einigen anderen Antworten hier, aber ich dachte, es könnte jemandem helfen. Wenn Sie die folgende Funktion für Ihr benutzerdefiniertes Objekt definieren, haben Sie eine Factory-Funktion, an die Sie ein generisches Objekt übergeben können, und die eine Instanz der Klasse für Sie zurückgibt.
CustomObject.create = function (obj) {
var field = new CustomObject();
for (var prop in obj) {
if (field.hasOwnProperty(prop)) {
field[prop] = obj[prop];
}
}
return field;
}
Verwenden Sie so
var typedObj = CustomObject.create(genericObj);
Dies ist nur eine Zusammenfassung der Antwort von Sayan Pal in kürzerer Form im ES5-Stil:
var Foo = function(){
this.bar = undefined;
this.buzz = undefined;
}
var foo = Object.assign(new Foo(),{
bar: "whatever",
buzz: "something else"
});
Ich mag es, weil es der sehr ordentlichen Objektinitialisierung in .Net am nächsten kommt:
var foo = new Foo()
{
bar: "whatever",
...
Das hat bei mir funktioniert. Es ist einfach für einfache Objekte.
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
getFullName() {
return this.lastName + " " + this.firstName;
}
static class(obj) {
return new Person(obj.firstName, obj.lastName);
}
}
var person1 = {
lastName: "Freeman",
firstName: "Gordon"
};
var gordon = Person.class(person1);
console.log(gordon.getFullName());
Ich habe auch nach einer einfachen Lösung gesucht, und das ist mir auf der Grundlage aller anderen Antworten und meiner Recherchen eingefallen. Grundsätzlich hat die Klasse Person einen anderen Konstruktor namens “Klasse”, der mit einem generischen Objekt des gleichen “Formats” arbeitet wie Person. Ich hoffe, das könnte auch jemandem helfen.
Shapon Pal
Hier haben Sie einen Weg, wenn Sie möchten. 1. Erstellen Sie ein Objekt mit allen gewünschten Eigenschaften. Rufen Sie dann dieses Objekt mit Ihren benutzerdefinierten Werten auf. Hier ist der Link zu JSFiddleund auch der Hauptteil der
function Message(obj) {
this.key = Date.now();
this.text = "";
this.type = "client";
this.status = 0;
this.senderID = "";
this.name = "";
this.photoURL = "";
this.metaData = [];
this.time = new Date().toISOString();
for (var prop in obj) {
if (this.hasOwnProperty(prop)) {
this[prop] = obj[prop];
}else{
this.metaData = [ ...this.metaData, {[prop]: obj[prop]} ];
}
}
}
const getAllMessages = function (messages=[]) {
var newMessages = [];
for (var i = 0; i < messages.length; i++) {
newMessages.push(new Message(messages[i]));
}
return newMessages;
};
var messages = [{
name: "Jhon",
text: "Hello 1"
}, {
name: "Smith",
text: "Hello 2",
meta1: "meta data 1"
}];
console.log("single Instances", new Message(messages[0]));
console.log("Multiple Instances",getAllMessages(messages));
10543000cookie-checkKönnen wir ein generisches Objekt in Javascript in einen benutzerdefinierten Objekttyp umwandeln?yes
Es gibt kein Casting in JavaScript, also … kurze Antwort ist nein. Längere Antwort ist … immer noch nein. Dies liegt daran, dass die [[prototype]]kann nur gesetzt werden, wenn ein Objekt erstellt wird. Man kann jedoch Methoden/Eigenschaften von Person zu Person1 affenpatchen (kopieren), was ohnehin ein Ansatz ist, der von einigen “Klassen-Frameworks” verwendet wird. Ich würde wahrscheinlich nur eine erstellen Neu Person von person1 in einem “Kopierkonstruktor”.
– Benutzer166390
5. Januar 2012 um 2:28 Uhr