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

Ich habe versucht, herauszufinden, was falsch ist mit diesem eine ganze Weile. Warum funktioniert das nicht? Allerdings funktioniert es, wenn ich die Folge verwenden:Hinzufügen von Prototyp zu JavaScript-Objekt Literal

STORE.item.prototype.add(); 

Antwort

71

Das Prototyp-Objekt gemeint ist auf constructor functions, im Grunde Funktionen verwendet werden, die die new operator aufgerufen werden, mit neuen Objektinstanzen zu erstellen.

Funktionen in JavaScript sind first-class Objekte, das heißt, Sie Mitglieder zu ihnen und behandeln sie wie gewöhnliche Objekte hinzufügen können:

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

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

Eine typische Anwendung des Prototypobjekts wie ich schon sagte, ist, wenn Sie instanziiert ein Objekt durch eine Konstruktorfunktion mit dem neuen Betreiber, zum Beispiel Aufruf:

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

var obj = new SomeObject(); 

Alle Instanzen von Someobject werden die Mitglieder vom SomeObject.prototype erben, weil die Mitglieder zugegriffen werden th grob die Prototypkette.

Jede Funktion in JavaScript hat ein Prototyp-Objekt, da nicht bekannt ist, welche Funktionen als Konstruktoren verwendet werden sollen.

+0

Vielen Dank für die Erklärung und den Link! Es ist jetzt viel klarer für mich. :) – John

+0

Gern geschehen @John, froh zu helfen! – CMS

+1

Große Erklärung! Daumen hoch!! –

2

Sie können JSON-Reviver verwenden, um Ihren JSON zur Parserzeit in Klassenobjekte umzuwandeln. Die EcmaScript 5 Entwurf hat die JSON2 reviver Schema bei http://JSON.org/js.html

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

Der optionale reviver Parameter ist eine Funktion beschrieben angenommen, die für jeden Schlüssel und Wert auf jeder Ebene des Endergebnis genannt wird. Jeder Wert wird durch das Ergebnis der Reviver Funktion ersetzt werden. Dies kann verwendet werden, um generische Objekte in Instanzen von Pseudoklassen zu reformieren, oder um das Datum Strings in Date-Objekte umzuwandeln.

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

Gut zu wissen diese Informationen. +1. Ein etwas ausführlicheres Beispiel mit myJSONtext und type function details wäre noch besser gewesen aber trotzdem danke für diese Info! –

9

Nach vielen Jahren, wenn JavaScript (ES2015 ankommt) haben wir endlich Object.setPrototypeOf() Methode

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

 

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

 

 
STORE.item.add();

1

Zum Zeitpunkt des Schreibens dieser mithilfe der __proto__ Eigenschaft möglich ist. Nur für den Fall, dass jemand hier derzeit und wahrscheinlich in der Zukunft prüft.

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

const pug = {} 
pug.__proto__ = dog; 

pug.bark(); 

jedoch die empfohlene Methode Prototyp in diesem Fall der Zugabe wird mit den Object.create. So wird der obige Code zu übersetzen:

const pug = Object.create(dog) 

pug.bark(); 

Oder Sie auch Object.setPrototypeOf in einer der Antworten, wie erwähnt verwenden können.

Hoffe, dass hilft.