Domanda

Ho un array di oggetto esistente definito con JSON. Gli oggetti sono ovviamente del tipo oggetto. Come li associo con un tipo di oggetto personalizzato per dare loro funzionalità specifiche?

È stato utile?

Soluzione

Il modo in cui lavoreremo in tutti i browser è di aumentare o ciascun elemento dell'array con le proprietà ei metodi che si desidera, o passare l'oggetto a un costruttore e creare un nuovo oggetto in base a proprietà e metodi del vecchio oggetto.

O se non si cura di 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();

Altri suggerimenti

Non credo che ci sia un modo per cambiare il tipo di un oggetto una volta che è stato creato. Per fortuna, probabilmente non effettivamente bisogno di cambiare la classe, degli oggetti - probabilmente sarete soddisfatti di dare agli oggetti alcuni nuovi metodi e altre funzionalità. (L'unica vera differenza è che cosa accadrebbe se si è modificato la classe, e la maggior parte delle persone non cambiare classe mentre il codice è in esecuzione.)

I lavorerò un esempio per voi. In primo luogo, creerò un oggetto semplice per rappresentare il JSON oggetti si dispone di:

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

Poi ho creerà qualche classe che si vorrebbe essere in grado di assegnare a myobj:

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

Questa nuova classe Speaker ha alcune funzionalità utili: si può utilizzare il metodo speak() per emettere informazioni utili:

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

mi esecuzione che ha dato il messaggio " Ciao, Sally ". Purtroppo, non si vuole un nuovo oggetto (come s) con questa funzionalità, si desidera che l'oggetto (myobj) esistente per averlo. Ecco come farlo:

myobj.speak = s.speak

Ora, quando eseguo questo:

myobj.speak()

Vedo il messaggio " Ciao, Fred ".

Per riassumere: creare un oggetto che fa quello che si vuole. Copiare tutti i metodi (e le eventuali variabili helper) nel tuo nuovo oggetto. Fatta eccezione per alcuni usi insoliti di eredità, questo renderà il vostro nuovo oggetto si comportano, se lo desideri.

Se non avete bisogno di costruttore, si può fare come:

Object.assign(new CustomType, {});

Se si desidera utilizzare un metodo specifico su di essi è possibile utilizzare applicare / call.

In alternativa, è possibile copiare i metodi per l'oggetto personalizzato.

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

Come complemento alla risposta di Jeremy, si potrebbe usare Object.create invece di giocare direttamente con proto . Avrete anche bisogno di un "estendere" la funzione.

Quindi, dato l'esempio di Jeremy, si potrebbe avere qualcosa di simile:

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top