2012-12-24 10 views
15

Ho confuso mentre leggevo la documentazione relativa emberjs.com http://emberjs.com/documentation/#toc_reopening-classes-and-instancesDifferenza tra riaprire() e reopenClass() in Ember.js

Nella pagina di cui sopra, si spiega in questo modo.

Person.reopen({ 
    // override `say` to add an ! at the end 
    say: function(thing) { 
    this._super(thing + "!"); 
    } 
}); 

Come si può vedere, riaprire viene utilizzato per aggiungere proprietà e metodi a un'istanza. Ma quando è necessario creare un metodo di classe o aggiungere le proprietà alla classe stessa, è possibile utilizzare reopenClass.

Person.reopenClass({ 
    createMan: function() { 
    return Person.create({isMan: true}) 
    } 
}); 

Person.createMan().get('isMan') // true 

anche se la spiegazione dice "Riaprire viene utilizzato per aggiungere proprietà e metodi a un'istanza." Penso che sia esempio mostrato in precedenza parlando di come creare metodo di classe o aggiungere le proprietà per la classe stessa , non per l'istanza.

Sto fraintendendo quello che dice? Non sono un programmatore esperto, quindi potrei essere frainteso ...

Spiegare quando usare riaprire e riaprire Class se sono frainteso.

Grazie in anticipo!

+1

[questo] (http://stackoverflow.com/questions/10269372/ember-js-how-does-reopenclass-work) la domanda può aiutarti. – coderatchet

risposta

1

Dopo aver sperimentato con reopen() e reopenClass(), ho capito la differenza tra loro.

Ecco il risultato del mio esperimento.

var Person = Ember.Object.extend({ 

    name:"", 
    alive:true, 
    sayHi:function(){ 
     alert("hi"); 
    } 

}); 

Person.reopenClass({ 
    age:30, 

    sayHo:function(){ 
    alert("ho"); 
} 

}); 

Person.reopen({ 
height:180, 
sayYo:function(){ 
    alert("yo"); 
} 
}) 

var person = Person.create({ 
    name:"Tom" 
}); 


//person.reopenClass();//error!! 

person.reopen({ 
    sayWhat:function(){ 
     alert("what!?"); 
    }, 

    weight:100 

}); 

console.log(Person.alive);//undefined 
console.log(Person.age);//30 
console.log(Person.height);//undefined 
console.log(Person.weight);//undefined 

console.log(person.alive);//true 
console.log(person.name);//Tom 
console.log(person.height);//180 
console.log(person.weight);//100 

person.sayHi();//it works 

//person.sayHo();//it doesn't work 
Person.sayHo();//it works 

person.sayYo();//it works 
//Person.sayYo();//it doesn't work 

//Person.sayWhat();//it doesn't work 
person.sayWhat(); 
+2

Potresti contrassegnare la tua domanda come risposta in modo che venga rimossa dall'elenco senza risposta? –

17

La documentazione non spiega molto bene, ma è un argomento molto difficile.

A proposito, ora vive a: http://emberjs.com/guides/object-model/reopening-classes-and-instances/

Uno dei problemi con il parlare di programmazione orientata agli oggetti è che è spesso spiegato in questo modo: - Gli oggetti sono oggetti. Gli oggetti sono istanze di una classe. - Le classi sono oggetti. - Le istanze sono oggetti e hanno una classe.

Questa spiegazione non aiuta chiunque a tutti, e sembra essere un problema ricorsiva (cioè non c'è fine al riferimento ... Un oggetto è un'istanza di una classe che è un oggetto ... (ripetere)).

preferisco ragionare nel modo seguente:

Quando le persone scrivono codice, spesso descrivono le classi e le istanze. Le classi sono un tipo di cosa. La frutta è un esempio di classe. Non stiamo parlando di una cosa particolare qui, stiamo parlando di un'intera "classe" di cose (da cui il nome).

Si noti che non è una vera classe. È reale solo quando è "live" e "in memoria nel computer". Fino ad allora, è una descrizione di una classe. Di solito quando le persone scrivono il codice, scrivono del testo in un file di testo, e questa è solo una descrizione del codice reale all'interno del computer che accade quando il computer lo interpreta o lo compila nel codice macchina.

Il trucco arriva quando ci si rende conto che anche una classe è di per sé una descrizione.È una descrizione di un'intera gamma di oggetti potenzialmente reali.

Nel computer, quando si crea "una mela", questa è un'istanza. È anche un oggetto. La sua classe è Apple, che in un computer è anche un vero oggetto dal vivo. Quando abbiamo parlare di Apple, è un'idea. Non esiste nella realtà, ma per un computer usare qualcosa deve farla esistere nella sua realtà, quindi "Apple" è un oggetto concreto, reale, anche se è anche un'astrazione.

Penso che l'ultimo punto sia quello che fa confondere le persone sugli oggetti. Le classi sono astrazioni, ma affinché il computer possa parlare e ragionare su di esse, devono essere rese reali. Quindi, decidiamo ... "classe significa astratto, istanza significa reale" ...

Il problema è che abbiamo un'eredità ... che porta l'idea di livelli di astrazione ... quindi nel nostro modello di frutta, hai la mela particolare di fronte a te, che è anche un frutto, e anche la frutta è un alimento. In realtà, il cibo in realtà non esiste come una cosa o un insieme di cose, a meno che non diciamo "questo cibo, questa mela" o "tutto il cibo del mondo" o "le lasagne di tua madre", quindi è un'idea astratta ...

Quindi, nel nostro computer orientato agli oggetti, diciamo "definire cibo che è un tipo di oggetto, ora definiamo la frutta che è un tipo di cibo, ora definiamo la mela che è una specie di frutto, ora definisci questo mela, che è una specie di mela ".

Ora questo significa: - L'oggetto è la classe di Cibo e Cibo è un'istanza di Oggetto e anche il Cibo è di per sé una classe! - Il cibo è la classe di Fruit, e Fruit è un'istanza di Food, e Fruit è di per sé anche una classe! - La frutta è di classe Apple e Apple è un'istanza di Fruit, e Apple è anche essa stessa una classe! - La mela è la classe della tua mela e la tua mela è un'istanza della mela (e quindi anche di frutta, cibo e oggetti!). Tuttavia, NON è una classe, è solo un oggetto.

Per ragionare sulla tua mela, potremmo dire che è un oggetto (nota in maiuscolo o), è anche una mela, un frutto e un cibo, e ... ecco il kicker .. è anche un oggetto.

Quindi ora speriamo di essere in una posizione in cui possiamo capire che la tua mela è un oggetto, un'istanza (di Apple, Fruit, Food & Object), una mela, un frutto, un cibo e un oggetto, ma non è una classe.

Quindi ... se si aggiunge un metodo di istanza a una classe, non sarà disponibile nella classe, ma sarà disponibile su tutte le istanze di tale classe. Se aggiungi un metodo di classe, sarà disponibile su quella classe (e sottoclassi). Quindi, se aggiungi un metodo di istanza ad Apple, tutte le istanze di Apple saranno in grado di eseguire tale metodo. Se aggiungi un metodo solo alla tua mela, però, solo la tua mela avrà quel metodo. La mia mela no. Se aggiungi un metodo di classe ad Apple, solo la classe Apple sarà in grado di eseguire quel metodo (che, comodamente, puoi accedere anche attraverso tutte le sue istanze). I metodi di classe sono per le cose che non cambiano le istanze PARTICOLAR. I metodi di istanza sono per le cose che cambiano le istanze PARTICOLAR (generalmente). La stessa cosa vale per proprietà/attributi. Non si creerebbe un metodo di classe nella classe Apple chiamato "Apple color" perché sembra che si riferisca alle particolari Mele (cioè istanze). Spero che questo chiarisca un po 'la questione :)