Ö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ı b
a
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.
Hangisi '' işlevi' döndürür? Object.create (Object) 'i iki kez listelediniz ve 3 varyasyon bir nesneyi bana geri gönderiyor. –
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. –
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