2013-05-21 26 views
13

Başkalarının devralacağı ve hangisinin daha verimli olacağı ilk ana nesne için hangi parametreyi geçirmeliyimarasındaki fark

Object.create(Object.prototype) 

Object.create(Object) 

Object.create(null) 

Object.create(null)

Object.create(Object) döndüren boş nesne ???? neden bir işlev döndürür (benim günlük kontrol ve fonksiyon ... ben console.dir kullanılan diyor())

Object.create(Object) döndüren bir boş olmayan nesne

... Ben Sınıfadı .prototype şey :(daha çok kullanılan bütün bunları işi m gelmez Nasıl

+0

Hangisi '' işlevi' döndürür? Object.create (Object) 'i iki kez listelediniz ve 3 varyasyon bir nesneyi bana geri gönderiyor. –

+0

Oh, Chrome 'Object.create (Object)' '' 'işlevini döndürür, görüyorum. Prototip olarak kullanılacak sade bir nesne yerine bir Oluşturucu’yu geçirmekten dolayı buggy davranışı gibi görünüyor. –

+0

Woah, bu berbattı. 'var a = Object.create (Nesne); bir arama; // işlev çağrısı() {[yerel kod]}; bir(); // TypeError: nesne bir işlev değil ' – phenomnomnominal

cevap

19

Önsöz burada neler olduğunu anlayamıyorum: JavaScript prototip mirasını kullanan, hangi bir nesnenin, bir başka nesne olan bir prototipini sahip olabileceği anlamına gelir. Bir özelliğin değerini, sahip olmadığı bir nesneden almayı denerseniz, JavaScript motoru bulmak için nesnenin prototipini (ve prototipini vb.) Görüntüler.

nesneler oluşturur. Object.create'u verdiğiniz ilk argüman, oluşturduğu nesnenin prototipi olarak kullanılacak nesnedir. Yani: bellekte bizi bu verir

// Create an object with a property 'foo' 
var a = { 
    foo: 42 
}; 

// Create a blank object using `a` as its prototype 
var b = Object.create(a); 

// Give `b` a property of its own 
b.bar = "hi"; 

:

 
          +---------------+  +-------------------+ 
          | [[Prototype]] |----->| (the standard  | 
a----------------------+-->| foo: 42  |  | object prototype) | 
         | +---------------+  +-------------------+ 
         | 
    +---------------+ | 
b-->| [[Prototype]] |--+ 
    | bar: "hi"  | 
    +---------------+ 

Kanıtı ba kullanır:

console.log(b.foo); // 42 
a.foo = 67; 
console.log(b.foo); // 67 

Varyasyonlarınızın bazılarının ele alınması:

var o = Object.create(Object.prototype); 

O Anlamsız, sadece var o = {}; kullanın, aynı şeyi yapar (prototip Object.prototype olan yeni bir boş nesne oluşturur).

var o = Object.create(Object); 

olan prototip Object fonksiyonudur yeni bir boş nesne o oluşturur. Bir işlev oluşturmaz, yalnızca prototip işlevi olan bir işlev olmayan nesne. Bu oldukça garip olurdu ve muhtemelen senin istediğin değil.

var o = Object.create(null); 

olan prototip null olan yeni bir boş nesne o oluşturur. Bu prototip null olduğundan, toString ve valueOf ve hasOwnProperty gibi olağan Object.prototype öğelerine sahip değildir. Bu, bir nesne/sözlük olarak bir nesne kullandığınız ve bu özellik adları için yanlış pozitifler istemediğiniz gibi, kullanım durumları olsa da, bu biraz sıra dışıdır. (ES2015'te [aka ES6] başka bir seçenek, bunun yerine Map kullanmaktır.thg435 altında bir yorumda işaret ettiği gibi)


, JavaScript hakkında kafa karıştırıcı şeylerden biri bir nesnenin prototip fonksiyonların gördüğünüz prototype özelliğinden tamamen farklı bir şey olmasıdır. prototype mülkünün farklı bir ismi olsaydı muhtemelen daha iyi olurdu (her ne kadar kitlesel olarak tıkanmadan ne olacağını hayal bile edemiyorum).

Bir nesne (o olarak adlandırın), özelliklerini miras aldığı bir prototip nesnesine sahiptir. İşlevlerin prototype özelliğindeki nesne, herhangi bir nesnenin prototipidir. Bunun yerine, 'un bu işlevi kullanarak new aracılığıyla oluşturulan herhangi bir nesnenin prototipi olarak atanan olacağıdır.

Örnekler burada yardımcı olabilir.

function Foo() { 
} 

Bu işlev, Foo, bir nesneye işaret eder bir özellik Foo.prototype sahiptir. Bu nesne henüz hiçbir şeyin prototipi olarak kullanılmaz. Sadece Foo nesne örneğinde prototype adlı bir özelliğe atanan bir nesne. nesne

var f = new Foo(); 

Şimdi özellikle o new Foo çağrısıyla oluşturulan f nesnenin prototip, bir prototip olarak kullanılır. Birkaç ayrıntıya göz ardı edilmesi

, bu kod satırı:

// Create a blank object, giving it `Foo.prototype` as its prototype 
var f = Object.create(Foo.prototype); 

// Call` Foo` using that new object as `this` 
Foo.call(f); 

Dediğim gibi, bu ayrıntılar birkaç dışarıda bırakır, ama umarım:

var f = new Foo(); 

... temelde bunu yapar işlevlerinin ne anlama geldiğini netleştirmeye yardımcı olur.

+2

Muhtemelen javascript'teki en büyük karışıklık kaynağı, x.prototype ve x'in prototipinin farklı şeyler olmasıdır. – georg

+0

@ thg435: Anlaşmalı. –

+0

şimdi daha kafam karıştı :(.... fark nedir – Nav

2

İade edilen şey bir nesnedir.

>>> typeof Object.create(Object) 
<<< "object" 
>>> Object.create(Object) 
<<< Function {} 
//   ^^ 

Function

Krom nesnenin yapıcısı giderir adıdır. oluşturulan nesne, örneğin call olarak devralır fonksiyon özellikleri vardır açıklarken, söz konusu phenomnomnominal yorumuna @ How are javascript class names calculated for custom classes in Chrome Dev Tools?


cevap adreslerinin Bu bölümünü bakınız.

Object yapıcı bir fonksiyondur ve böylece Function prototip devralır:

:

>>> Object.call === Function.prototype.call 
<<< true 

Yani prototip olarak Object sahip bir nesne de prototip zinciri yoluyla Fonksiyon prototip bir bağlantı olacak


Ve bir kurucu kullanarak, @TJ tarafından belirtildiği gibi prototip oldukça garip olarak

>>> Object.create(Object).call === Function.prototype.call 
<<< true 
.Bir nesneyi, oluşturulan nesnenin miras aldığı prototip olarak belirtmelisiniz. @TJ zaten bu bölümü açıklayan oldukça iyi bir iş yaptı.