2010-01-31 7 views
6

Jakie są różnice pomiędzy tymi dwoma sposobami tworzenia klasy:różnica między tymi 2 sposoby tworzenia klasy w javascript

var apple = { 
    type: "macintosh", 
    color: "red", 
    getInfo: function() { 
     return this.color + ' ' + this.type + ' apple'; 
    } 
} 

function Apple (type) { 
    this.type = type; 
    this.color = "red"; 
    this.getInfo = function() { 
     return this.color + ' ' + this.type + ' apple'; 
    }; 
} 

i jak instancję i korzystają z członków?

+0

Tworzysz tylko obiekt, a nie klasę. – Gumbo

Odpowiedz

6

Chociaż JavaScript jest językiem obiektowym, nie używa klas. Nie tworzysz "klasy" w JavaScript. Tworzysz "prototyp". JavaScript jest uważany za Prototype-based language.

Pierwszy przykład jest znany jako "object-literal notation" do tworzenia obiektu (którego podzestaw jest popularnie znany jako JSON). Analogią do tego w językach klasowych jest klasa "statyczna", w tym sensie, że w tym przypadku nie trzeba tworzyć nowej instancji obiektu; Po prostu "istnieje", po zdefiniowaniu. Nie można utworzyć instancji, użytkownik uzyska dostęp do członków apple natychmiast, ponieważ apple jest już obiektem. Jest to podobne do tworzenia anonimowej klasy w Javie. Można by użyć go w ten sposób:

alert(apple.getInfo()); 

W drugim przykładzie, podczas tworzenia prototypu (nie klasa), który może być używany do tworzenia wystąpień obiektów typu Apple. Można używać go tak:

var redDelicious = new Apple("Red Delicious"); 
alert(redDelicious.getInfo()); 

JavaScript pozwala modyfikować i dodawać do prototypu obiektu, więc po ogłosił swój prototyp Apple, można nadal dodawać lub zmieniać rzeczy o nim tak:

Apple.prototype.size = "7cm"; 

Po wykonaniu tej czynności wszystkie obiekty pochodzące z prototypu Apple uzyskają pole size. To jest podstawa do tego, jak PrototypeJS framework działa w celu modyfikacji natywnych obiektów JavaScript w celu dodania funkcjonalności poprawki &.

Należy pamiętać, że niewłaściwa praktyka polega na modyfikowaniu prototypu natywnych obiektów JavaScript, dlatego należy unikać robienia tego w miarę możliwości.

+0

Pierwszy przykład nie jest klasą statyczną. Jest to obiekt JS utworzony przy użyciu składni literalnej obiektu. – SolutionYogi

+0

@SolutionYogi Wiem, że to nie jest klasa statyczna; pierwszą rzeczą, o której wspomniałem w mojej odpowiedzi, jest to, że w JavaScript nie ma klas. Łatwiej jest jednak objaśnić składnię opartą na prototypie JavaScript przy użyciu analogii, które ludzie już znają, jeśli zaprogramowali w języku, który używa klas. –

+0

Nadal uważam, że nazywanie go "klasą statyczną" jest całkowicie błędne. Klasa statyczna nie może mieć stanu. Powiedziałbym to w ten sposób: W tradycyjnym języku OOP nie można utworzyć obiektu bez klasy, ale w JavaScript można. I tak właśnie zrobił użytkownik w pierwszym przykładzie. – SolutionYogi

3

Twoje pierwsze podejście jest JavaScript Object Literal i mogą być dostępne przez:

apple.type; // returns "macintosh" 
apple.getInfo(); // prints "red macintosh apple" 

Można również dodawać własne właściwości jak wasGood lub price tak:

apple.wasGood = "true"; 
apple.price = "0.50"; 
alert(apple.price); // alerts "0.50" 

Twoje drugie podejście instancji obiektu i jest dostępny przez:

var myApple = new Apple("macintosh"); 
myApple.type; // returns "macintosh" 
myApple.getInfo(); // returns "red macintosh apple" 

Dodawanie właściwości do obiektu firmy Apple trzeba użyć prototype kluczowe:

Apple.prototype.price = "0.50"; 
Apple.prototype.wasGood = "true"; 
alert(myApple.price); // alerts "0.50" 
3

Oto różnice:

  • Pierwszym sposobem jest niekompletny, jest średnik brakuje po ostatnim wspornikiem zamknięcia .

  • Pierwszy sposób tworzy obiekt, a drugi deklaruje tylko konstruktor, który może być użyty do tworzenia obiektów.

  • Pierwszy sposób może utworzyć tylko jeden obiekt, podczas gdy drugi sposób może być użyty przez słowo kluczowe new do tworzenia wielu obiektów.

  • Pierwszy sposób nie może przyjmować żadnych parametrów, aby wpłynąć na sposób inicjowania obiektu, podczas gdy drugi może.

Pierwszy sposób tworzy pojedynczy obiekt i przypisuje do zmiennej apple, które można wykorzystać, aby uzyskać dostęp do członków:

alert(apple.type); 

Drugim sposobem jest używany z kluczowych new do utworzenia instancji:

var green = new Apple('Signe Tillisch'); 
alert(green.type); 
Powiązane problemy