2009-10-20 21 views
46
STORE = { 
    item : function() { 
    } 
}; 
STORE.item.prototype.add = function() { alert('test 123'); }; 
STORE.item.add(); 

Neredeyse bir süredir neyin yanlış olduğunu anlamaya çalışıyorum. Bu neden çalışmıyor? Prototip nesnesi, constructor functions yeni nesne örneklerini oluşturmak için new operator kullanılarak çağrılır temelde fonksiyonları kullanılmak üzere içindirJavaScript Nesnesine Prototip Ekleme Nesne Çizgisi

STORE.item.prototype.add(); 

cevap

71

: Ben takip kullandığınızda Ancak çalışır. JavaScript

Fonksiyonlar bunlara üye eklemek ve sıradan nesneler gibi onları tedavi anlamına gelir first-class nesnelerdir:

var STORE = { 
    item : function() { 
    } 
}; 

STORE.item.add = function() { alert('test 123'); }; 
STORE.item.add(); 

sen örneğini zaman önce söylediğim gibi prototip nesnesine tipik kullanımı ise üyeler inci erişilebilir olacaktır, çünkü SomeObject arasında

function SomeObject() {} // a constructor function 
SomeObject.prototype.someMethod = function() {}; 

var obj = new SomeObject(); 

Tüm örnekler SomeObject.prototype üyeleri devralır: örneğin, yeni bir operatör ile yapıcı fonksiyonunu çağırarak bir amacı, prototip zincirini pürüzlendirmek.

JavaScript'teki her işlev bir prototip nesnesine sahiptir, çünkü hangi işlevlerin kurucu olarak kullanılacağını bilmenin bir yolu yoktur.

+0

Açıklama ve bağlantı için çok teşekkür ederim! Şimdi benim için daha net. :) – John

+0

Size yardımcı olmaktan memnuniyet duyarız @John! – CMS

+1

Harika bir açıklama! başparmak havaya!! –

2

JSON'unuzu ayrıştırma sırasında sınıf nesnelerine dönüştürmek için JSON revivers'lerini kullanabilirsiniz. ECMAScript 5 taslak http://JSON.org/js.html

var myObject = JSON.parse(myJSONtext, reviver); 

opsiyonel reviver parametresi nihai sonuç her düzeyinde her anahtar ve değer için çağrılacak bir fonksiyonudur adresinde açıklanan JSON2 reviver şemasını kabul etmiştir. Her bir değer, reviver işlevinin sonucuyla değiştirilecektir. Bu, genel nesnelerini pseudoclasses örneklerine dönüştürmek veya dizgilerini Date nesnelerine dönüştürmek için kullanılabilir. JavaScript (ES2015 geldiğinde) Yıllar sonra

myData = JSON.parse(text, function (key, value) { 
    var type; 
    if (value && typeof value === 'object') { 
     type = value.type; 
     if (typeof type === 'string' && typeof window[type] === 'function') { 
      return new (window[type])(value); 
     } 
    } 
    return value; 
}); 
+0

Bu bilgiyi bilmek güzel. +1. MyJSONtext ve tip fonksiyon detayları ile biraz daha ayrıntılı bir örnek daha iyi olurdu ama yine de bu bilgi için teşekkürler! –

9

, elimizdeki nihayet Object.setPrototypeOf() yöntem bu __proto__ özelliğini kullanarak mümkündür Bu yazı olarak

const STORE = { 
 
    item: function() {} 
 
}; 
 

 

 
Object.setPrototypeOf(STORE.item, { 
 
    add: function() { 
 
    alert('test 123'); 
 
    } 
 
}) 
 

 

 
STORE.item.add();

1

. Sadece buradaki herkes şu anda ve muhtemelen gelecekte kontrol ediyor.

const dog = { 
    name: 'canine', 
    bark: function() { 
     console.log('woof woof!') 
    } 
} 

const pug = {} 
pug.__proto__ = dog; 

pug.bark(); 

Ancak bu durumda prototip eklemenin önerilen yolu Object.create kullanıyor. Yani yukarıdaki kod çevrilir:

const pug = Object.create(dog) 

pug.bark(); 

Veya cevapları birinde belirtildiği gibi ayrıca Object.setPrototypeOf kullanabilirsiniz.

Bu yardımcı olur umarım.

İlgili konular