2009-09-14 25 views
11

, lütfen herkesin bana Javascript'teMyClass.prototype = new Object() ve MyClass.prototype = Object arasındaki fark

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

ve

MyClass.prototype = Object; 

arasındaki fark olduğunu söyleyebilir mi? Ve sonuçta herhangi bir fark yoksa, hangisinin en iyi pratik olduğu yol hangisidir?

+0

olası yinelenen (http://stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-keyword-here) – Bergi

+1

@Bergi bu soru 4 yaşından büyüktür. Bağlandığınız kişi 2 yaşında ... – moxn

+0

1,5 yaşındaki cevap hala geçerli ve bu soru hala arama ve bağlantılar yoluyla bulundu. Diğer yararlı cevaplara işaret etmelidir… – Bergi

cevap

11

İlk iki örnek tamamen eşdeğerdir:

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

Üçüncü örnek geçerli değil, sen MyClass.prototype bir başvuru için atama beri Object yapıcı, ve bir işlev değil, yeni bir nesne.

Şahsen ikinci, nesneyi tercih literal veya initialiser sözdizimi:

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

Düzenleme: bu nedenle yorumunuza yanıt olarak, boş bir nesne değişmezi { } esasen eşdeğer new Object():

üretim ObjectLiteral: {} şöyle değerlendirilir:

  1. Yeni Object() ifadesine göre yeni bir nesne oluşturun.
  2. Geri Sonuç (1). Daha fazla ayrıntı için

ECMAScript Language Spec (pdf) ait 11.1.5 bölümüne (Başlatıcı Nesne) kontrol edin.

Düzenleme: üçüncü örnek hataları üretmez, ancak daha sonra MyClass.prototype uzatsak kolayca Nesne yapıcı işlevini eğlenebiliriz örneğin, hiç iyi değil edecek:

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

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

Hmhm, bu yüzden her iki örnekte de herhangi bir tür hata üretmiyorsa ve aslında Aynı şeyi yapın (aslında olduğu gibi), yalnızca tarayıcının javascript motorunun laklığı ikinci örneğe izin verir mi? – moxn

+0

Hayır, biliyorum {} == new Object(). "İkinci örnek" ile kastettiğim şey ... prototip = Object; – moxn

+0

Tamam, anlıyorum. Açıklama için teşekkür ederim. – moxn

2

Object'a bağlıdır. Bir işlevse, new Object() yöntemini kullanmak istiyorsunuz. Bir "sanal sınıf" ise (Object = {someProperty: someValue} kullanarak tanımlanmış) ikinci yöntemi kullanın.

JavaScript prototip miras üzerinde this page Bazı daha fazla yol gösterici

+1

Harika bağlantı, teşekkürler – moxn

0

MyClass.prototype.method1: fonksiyonu() {/ ** /}; Yukarıda

Düzeltme: Bu

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

(eşittir 'Method1' sonra oturum Not) olmalıdır.yöntem tanımı gibi bir nesne tanımı içinde kendini olduğunda kolon sadece kullanılır

: [? Burada 'yeni' anahtar kelimeyi kullanmayı sebebi nedir] arasında

var myObject = {myVar1: 10, myMethod1: function() { /* */}; 
İlgili konular