2012-12-24 9 views
15

ich verwirrt habe, während ich in der Dokumentation auf emberjs.com http://emberjs.com/documentation/#toc_reopening-classes-and-instancesUnterschied zwischen erneut öffnen() und reopenClass() in Ember.js

auf der Seite oben zu lesen war, erklärt es wie folgt.

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

Wie Sie sehen können, ist wieder öffnen verwendet Eigenschaften und Methoden zu einer Instanz hinzuzufügen. Wenn Sie jedoch eine Klassenmethode erstellen oder die Eigenschaften der Klasse selbst hinzufügen müssen, können Sie reopenClass verwenden.

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

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

obwohl die Erklärung sagt „Eigenschaften und Methoden wird wieder öffnen verwendet, um eine Instanz hinzuzufügen.“, Ich denke, beide obige Beispiel reden gezeigt, wie Klassenmethode zu erstellen oder die Eigenschaften der Klasse selbst hinzufügen nicht zur Instanz.

Bin ich falsch verstanden, was es sagt? Ich bin kein erfahrener Programmierer, also könnte ich missverstanden werden ...

Bitte erklären Sie, wenn ich wieder zu öffnen und reopenClass, wenn ich missverstanden bin.

Vielen Dank im Voraus!

+1

[this] (http://stackoverflow.com/questions/10269372/ember-js-how-does-reopenclass-work) Frage kann Ihnen helfen. – coderatchet

Antwort

1

Nachdem ich mit reopen() und reopenClass() experimentiert habe, habe ich den Unterschied zwischen ihnen herausgefunden.

Hier ist das Ergebnis meines Experiments.

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

Könnten Sie bitte Ihre Frage als beantwortet markieren, damit sie aus der unbeantworteten Liste entfernt wird? –

17

Die Dokumentation dies nicht sehr gut erklären, aber es ist ein sehr heikles Thema.

BTW, sie lebt jetzt bei: http://emberjs.com/guides/object-model/reopening-classes-and-instances/

Eines der Probleme, mit Gespräch über Objektorientierte Programmierung ist, dass es oft wie folgt erklärt hat: - Objekte Objekte sind. Objekte sind Instanzen einer Klasse. - Klassen sind Objekte. - Instanzen sind Objekte und haben eine Klasse.

Diese Erklärung hilft nicht anyone überhaupt, und scheint ein rekursives Problem zu sein (dh es gibt kein Ende der Referenzierung ... Ein Objekt ist eine Instanz einer Klasse, die ein Objekt ist ... (wiederholen)).

Ich ziehe es in der folgenden Art und Weise zur Vernunft:

Wenn die Leute Code zu schreiben, die sie beschreiben oft Klassen und Instanzen. Klassen sind eine Art von Sache. Frucht ist ein Beispiel für eine Klasse. Wir sprechen hier nicht über eine bestimmte Sache, wir sprechen über eine ganze "Klasse" von Dingen (daher der Name).

Beachten Sie, dass es keine echte Klasse ist. Es ist nur real, wenn es "live" und "im Speicher im Computer" ist. Bis dahin ist es eine Beschreibung einer Klasse. Wenn Menschen Code schreiben, schreiben sie normalerweise Text in eine Textdatei, und das ist nur eine Beschreibung des echten Codes innerhalb des Computers, der passiert, wenn der Computer ihn in Maschinencode übersetzt oder kompiliert.

Das schwierige Bit kommt, wenn Sie erkennen, dass eine Klasse tatsächlich selbst eine Beschreibung ist.Es ist eine Beschreibung einer ganzen Reihe potentiell realer Objekte.

In dem Computer, wenn Sie "einen Apfel" erstellen, ist das eine Instanz. Es ist auch ein Objekt. Seine Klasse ist Apple, die in einem Computer auch ein echtes Live-Objekt ist. Wenn wir reden über Apple, das ist eine Idee. Es existiert nicht in der Realität, aber damit ein Computer etwas verwenden kann, muss es ihn in seiner Realität existieren lassen, also ist "Apple" ein konkretes, reales Objekt, obwohl es auch eine Abstraktion ist.

Ich denke, der letzte Punkt ist, was Leute über Objekte verwirrt. Klassen sind Abstraktionen, aber damit der Computer darüber reden und argumentieren kann, müssen sie real gemacht werden. Also, wir entscheiden ... "Klasse bedeutet abstrakt, Instanz bedeutet real" ...

Das Problem ist, wir haben Vererbung ... was bringt die Idee Schichten der Abstraktion ... so in unserem Obst-Modell, Sie haben den besonderen Apfel vor Ihnen, der auch eine Frucht ist, und Obst ist auch ein Essen. In Wirklichkeit existiert das Essen nicht wirklich als ein Ding oder eine Menge von Dingen, es sei denn, wir sagen "dieses Essen, dieser Apfel" oder "all das Essen in der Welt" oder "Lasagne deiner Mutter", dann ist es eine abstrakte Idee ...

Also, in unserem objektorientierten Computer, sagen wir "definiere Essen, das eine Art von Objekt ist, definiere nun Obst, das eine Art von Essen ist, definiere nun Apple, das eine Art von Frucht ist, definiere dies jetzt Apfel, der eine Art von Apple ist ".

Nun bedeutet das: - Objekt ist Essens Klasse, und Essen ist eine Instanz von Objekt, und Essen ist auch selbst eine Klasse! - Essen ist Fruits Klasse, und Fruit ist ein Beispiel für Essen, und Fruit ist selbst auch eine Klasse! - Fruit ist Apples Klasse, und Apple ist eine Instanz von Fruit, und Apple ist auch selbst eine Klasse! - Apple ist die Klasse deines Apfels und dein Apfel ist eine Instanz von Apple (und damit auch von Obst, Lebensmitteln und Gegenständen!). Es ist jedoch keine Klasse, es ist nur ein Objekt.

Um über Ihren Apfel zu denken, würden wir sagen, es ist ein Objekt (beachten Sie die Kleinbuchstaben o), es ist auch ein Apfel, und ein Obst und ein Essen, und ... hier ist der Kicker .. es ist auch ein Objekt.

So jetzt hoffentlich sind wir in einer Position, wo wir verstehen können, dass Ihr Apfel ein Objekt, eine Instanz (von Apfel, Obst, Lebensmittel, ein Apfel, eine Frucht, ein Essen und ein Objekt) ist es ist keine Klasse.

Wenn Sie also eine Instanz-Methode zu einer Klasse hinzufügen, ist sie für die Klasse nicht verfügbar, aber für alle Instanzen dieser Klasse verfügbar. Wenn Sie eine Klassenmethode hinzufügen, ist sie für diese Klasse (und Unterklassen) verfügbar. Wenn Sie also eine Instanzmethode zu Apple hinzufügen, können alle Instanzen von Apple diese Methode ausführen. Wenn Sie jedoch nur Ihrem Apple eine Methode hinzufügen, wird nur diese Methode für Ihren Apfel verwendet. Mein Apfel wird nicht. Wenn Sie Apple eine Klassenmethode hinzufügen, kann nur die Apple-Klasse diese Methode ausführen (auf die Sie bequem auch über alle Instanzen zugreifen können). Klassenmethoden sind für Dinge, die sich nicht ändern PARTICULAR Instanzen. Instanzmethoden sind für Dinge, die sich ändern (PARTICULAR Instanzen). Das Gleiche gilt für Eigenschaften/Attribute. Sie würden keine Klassenmethode in der Apple-Klasse namens "Apple color" erstellen, da dies so klingt, als ob es sich auf insbesondere Äpfel (dh Instanzen) bezieht. Hoffentlich das räumt ein wenig auf :)

Verwandte Themen