Frage

ich eine Reihe von bestehenden bezwecken mit JSON definiert. Die Objekte sind offensichtlich von dem Objekttyp. Wie kann ich sie mit einem benutzerdefinierten Objekttyp assoziieren sie spezifische Funktionalität zu geben?

War es hilfreich?

Lösung

Die Art und Weise, die in allen Browsern funktionieren muß, ist entweder jedes Element im Array erweitert mit den Eigenschaften und Methoden, die Sie wollen, oder das Objekt mit einem Konstruktor übergeben und ein neues Objekt Eigenschaften und Methoden basierend auf dem alte Objekt erstellen.

Oder wenn Sie kümmern sich nicht um IE:

var obj = {
    name : "Jeremy"
};

function CustomType() {
    this.name = this.name || "someValue";
    this.greeting = "Hi";
}

CustomType.prototype.sayHi = function() {
    alert(this.greeting + ", " + this.name);
};

obj.__proto__ = CustomType.prototype;
obj.constructor.call(obj);

obj.sayHi();

Andere Tipps

Ich glaube nicht, dass es eine Möglichkeit ist, den Typ eines Objekts zu ändern, nachdem es erstellt wird. Glücklicherweise brauchen Sie wahrscheinlich nicht wirklich die Klasse zu ändern, Ihrer Objekte - Sie werden wahrscheinlich mit Angabe der Objekte einige neue Methoden und andere Funktionen erfüllt werden. (Der einzige wirkliche Unterschied ist, was passieren würde, wenn Sie die Klasse GEäNDERT, und die meisten Menschen nicht ändern Klassen während Code ausgeführt wird.)

Ich werde ein Beispiel für Sie arbeiten. Zuerst werde ich ein einfaches Objekt erstellen die JSON darstellen Objekte, die Sie haben:

var myobj = new Object()
myobj.name = "Fred"

Dann werde ich etwas Klasse erstellen, die Sie myobj zuweisen können, möchten:

function Speaker() {
    this.speak = function() {
        window.alert("Hello, " + this.name);
    }
}

Diese neue Speaker Klasse hat einige nützliche Funktionen: es die Methode speak() zur Ausgabe nützliche Informationen verwenden können:

var s = new Speaker()
s.name = "Sally"
s.speak()

Ausführen gab, dass mir die Meldung " Hallo, Sally ". Leider wollen, können Sie (wie s) mit dieser Funktionalität nicht ein neues Objekt möchten, können Sie das vorhandene Objekt (myobj) zu haben. Hier ist, wie Sie das tun:

myobj.speak = s.speak

Nun, wenn ich dies ausführen:

myobj.speak()

Ich sehe die Meldung " Hallo, Fred ".

Fazit: ein Objekt erstellen, das tut, was Sie wollen. Kopieren Sie alle Methoden (und alle Hilfsvariablen) in das neue Objekt. Mit Ausnahme von einigen ungewöhnlichen Anwendungen der Vererbung, dies wird Ihr neues Objekt zu verhalten, wie gewünscht.

Wenn Sie Konstruktor nicht brauchen, können Sie tun, wie:

Object.assign(new CustomType, {});

Wenn Sie auf sie eine bestimmte Methode verwenden möchten, können Sie verwenden, gelten / Anruf.

Sie können auch die Methoden für das benutzerdefinierte Objekt kopieren.

function Object1() {
  this.aValue = "10";
}

function CustomObject() {
  this.customValue = "6";
}

function convertToCustom(obj) {
  var custom = new CustomObject();
  for( var key in obj ) {
    custom[key] = obj[key];
  }
  return custom;
}

var obj = new Object1();
var custom = convertToCustom(obj);

console.log(custom.customValue); // <- 6
console.log(custom.aValue);      // <- 10

Als Ergänzung zu Jeremys Antwort, Sie Object.create statt direkt spielen mit proto verwenden könnte. Sie werden auch eine „erweitern“ Funktion benötigen.

So, da Jeremy Beispiel Sie so etwas wie dieses haben könnte:

var obj = {
name : "Jeremy"
};


function CustomType() {
}

CustomType.prototype.init = function(){
    this.name = this.name || "someValue";
    this.greeting = "Hi";
    return this; //let's make it fluent
}

CustomType.prototype.sayHi = function() {
    console.log(this.greeting + ", " + this.name);
};

function extend(obj, props) { 
    for(prop in props) { 
        if(props.hasOwnProperty(prop)) { 
            obj[prop] = props[prop]; 
        } 
    }
    return obj; //let's make it fluent
}

obj = extend(Object.create(CustomType.prototype), obj).init();

obj.sayHi();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top