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

Od dłuższego czasu próbuję ustalić, co jest nie tak. Dlaczego to nie działa? Jednak to działa, gdy używam następująco:Dodawanie prototypu do JavaScript Object Literal

STORE.item.prototype.add(); 

Odpowiedz

71

Przedmiotem prototyp ma być używany na constructor functions, w zasadzie funkcje, które zostaną nazwane pomocą new operator do tworzenia nowych instancji obiektów.

funkcje w JavaScript są first-class obiektów, co oznacza, że ​​można dodać członków do nich i traktować je jak zwykłe przedmioty:

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

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

Typowym zastosowaniem obiektu prototypu jak powiedziałem wcześniej, jest podczas wystąpienia przedmiotem przez wywołanie funkcji konstruktora z nowym operatorem, na przykład:

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

var obj = new SomeObject(); 

Wszystkie przypadki SomeObject posiądą członków z SomeObject.prototype, ponieważ będą dostępne członkowie th szorstki łańcuch prototypów.

Każda funkcja w kodzie JavaScript ma obiekt prototypowy, ponieważ nie ma możliwości sprawdzenia, które funkcje mają być używane jako konstruktory.

+0

Dziękuję bardzo za wyjaśnienie i link! Teraz jest o wiele jaśniej. :) – John

+0

Nie ma za co. @John, cieszymy się z pomocy! – CMS

+1

Świetne wyjaśnienie! kciuki w górę!! –

2

Możesz użyć revivers JSON, aby przekształcić JSON w obiekty klasy w czasie analizy. ECMAScript 5 projekt przyjęła plan Reviver JSON2 opisaną w http://JSON.org/js.html

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

Opcjonalny parametr odnowiciel jest funkcja, która zostanie wywołana dla każdego klucza i wartości na każdym poziomie wyniku końcowego . Każda wartość będzie zastąpiona przez funkcję rewitalizatora . Można go użyć do przekształcenia ogólnych obiektów w instancje pseudoklasy lub do przekształcenia ciągów daty w obiekty Date.

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

Dobrze znać tę informację. +1. Nieco bardziej szczegółowy przykład z funkcją myJSONtext i opisem funkcji typu byłby jeszcze lepszy, ale dzięki za te informacje! –

9

Po wielu latach, kiedy JavaScript (ES2015 przybywa) mamy wreszcie Object.setPrototypeOf() metoda

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

 

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

 

 
STORE.item.add();

1

W chwili pisania tego jest to możliwe za pomocą właściwości __proto__. Na wszelki wypadek, jeśli ktoś tutaj sprawdzi to i prawdopodobnie w przyszłości.

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

const pug = {} 
pug.__proto__ = dog; 

pug.bark(); 

jednak zalecany sposób dodawania prototyp w tym przypadku używa Object.create. Więc powyższy kod zostanie przetłumaczony na:

const pug = Object.create(dog) 

pug.bark(); 

Albo można też użyć Object.setPrototypeOf jak wspomniano w jednym z odpowiedzi.

Nadzieję, że pomaga.

Powiązane problemy