2009-09-14 10 views
11

może ktoś proszę mi powiedzieć, gdzie w JavaScript różnica międzyRóżnica między MyClass.prototype = new Object() i MyClass.prototype = Object

MyClass.prototype = new Object(); //or ... = {} 

i

MyClass.prototype = Object; 

jest? A jeśli nie ma różnicy w wyniku, która z nich jest najlepszą praktyką?

+0

możliwym duplikat (http://stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-keyword-here) – Bergi

+1

@Bergi to pytanie ma więcej niż 4 lata. Ten, z którym się łączysz, ma 2 lata ... – moxn

+0

Ta 1,5-letnia odpowiedź jest nadal ważna, a to pytanie wciąż można znaleźć za pomocą wyszukiwarki i linków. Powinien wskazywać na inne pomocne odpowiedzi ... – Bergi

Odpowiedz

11

Twoje pierwsze dwa przykłady są całkowicie równoważne:

MyClass.prototype = new Object(); // empty object 
MyClass.prototype = {}; // empty object 

Twój trzeci przykład nie jest ważne, ponieważ jesteś przypisywanie do MyClass.prototype odniesienie do konstruktor Object i jest to funkcja, a nie nowy obiekt.

Osobiście preferuję drugie, obiekt literal lub initialiser składnia:

MyClass.prototype = {prop1: 'value', prop2: 'value2'}; 
//... 
MyClass.prototype.foo = 'bar'; 
MyClass.prototype.method1: function() {/**/}; 

Edit: W odpowiedzi na Twój komentarz, pusty obiekt dosłowne { } zasadniczo równoważne new Object() z tego powodu:

ProdukcjaLoga obiektu: {} jest oceniana w następujący sposób:

  1. Utwórz nowy obiekt, jak przy wyrażeniu new Object().
  2. Wynik zwrotu (1).

Więcej szczegółów z sekcji 11.1.5 (Przedmiot Initialiser) z ECMAScript Language Spec (PDF).

Edit: Trzeci przykład nie przyniesie żadnych błędów, ale nie jest dobre na wszystko, na przykład można łatwo sprać funkcję konstruktora obiektu, jeśli potem przedłużyć ten MyClass.prototype:

MyClass.prototype = Object; 
MyClass.prototype.foo = 'bar'; 

Object.foo === MyClass.prototype.foo; // true 
+0

Hmhm, więc jeśli oba przykłady nie powodują błędów jakiegokolwiek rodzaju i zasadniczo zrobić to samo (tak jak jest), jest to tylko rozluźnienie mechanizmu javascript przeglądarki, który pozwala na działanie drugiego przykładu? – moxn

+0

Nie, wiem, że {} == nowy obiekt(). Co rozumiem przez "drugi przykład" to ... prototype = Object; – moxn

+0

Dobra, rozumiem. Dziękuję za wyjaśnienie. – moxn

2

To zależy od Object. Jeśli jest to funkcja, którą chcesz zastosować, użyj metody new Object(). Jeśli jest to "klasa wirtualna" (zdefiniowana przy użyciu Object = {someProperty: someValue}), wówczas używa się drugiej metody.

trochę więcej wskazówek w this page na prototypowego dziedziczenia w JavaScripcie

+1

Świetny link, dzięki – moxn

0

MyClass.prototype.method1: function() {/ ** /};

Korekta wyżej: powinien być

MyClass.prototype.method1 = function() {/**/}; 

(Uwaga znak równości po 'method1').

Dwukropek jest używany tylko wtedy, gdy definicja metoda jest się w ramach definicji obiektu, takich jak: [? Jaki jest powód do korzystania z „nowych” słowa kluczowego tutaj]

var myObject = {myVar1: 10, myMethod1: function() { /* */}; 
Powiązane problemy