2009-07-22 12 views

Antwort

6
  1. Da Sie den Object Prototyp ersetzt haben, so dass Sie ein objSayHello Verfahren auf ein beliebiges Objekt Hinzufügen sind von Object (alle Objekte) absteigend.

  2. Nicht ersetzen Object.prototype.

Was möchten Sie wahrscheinlich ist:

someObj.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')}; 

Dann nennen es mit:

someObj.objSayHello(); 

Was Sie scheinen tun zu werden und bedeutet:

Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')}; 

Aber das ist wahrscheinlich eine schlechte Idee, da es mit i kollidieren wird terators (for...in) wenn nicht richtig behandelt.

1
Object.prototype.objSayHello = function(to){alert('Hello, ' + to)}; 

Die obige Aussage bedeutet, dass Sie die objSayHello Funktion auf alle Fälle angebracht, die als jede Instanz erstellt wird, ist Kind von Object so das angeschlossene Ereignis binden an alle. Zum Beispiel

var newObject = {}; 
var anotherNewObject = new Object(); 

function person(name) { 
this.name = name; 
} 
var newPerson = new Person("Ramiz"); 

newObject.objSayHello("newObject"); 
anotherNewObject.objSayHello("anotherNewObject"); 
newPerson.objSayHello(this.name); 

Während die andere Aussage falsch und wird vollständig ignoriert werden, da Sie sind die prototype ein Objekt zu verwerfen, die Eltern von allen sind. Wenn der prototype von Object überschrieben werden kann, sind alle nativen Instanzenfunktionen verloren. Um einen solchen Fehler zu vermeiden, denke ich, dass dies ignoriert wird.

2

Object.prototype ist aus irgendeinem Grund ein const, was bedeutet, nur lesen.

0

Object.prototype ist nicht wirklich der echte Prototyp, es ist nur eine Referenz. Ein internes Objekt [[Prototyp]] wird als Prototyp verwendet und ist in einigen Browsern als proto Eigenschaft eines Objekts verfügbar. In Anbetracht der Funktionsweise von JavaScript-Variablen ändert die Zuweisung des Object.prototype zu einem anderen Objekt seine Referenz, ohne das interne Objekt [[Prototyp]] zu ändern. Daher erhalten Sie eine normale Eigenschaft namens prototype, die nichts über die Auflösung von Objekteigenschaften aussagt.

Warum funktioniert das also, wenn Sie Object.prototype.myFunction() ausführen? Der Object.prototype ist immer noch eine Referenz an den internen [[Prototyp]], so dass es kein Problem hat, ihn mit dieser Funktion zu erweitern, er funktioniert wie mit allen anderen Objekten.

1

Augenlidness ist falsch, Sie einfach can't reassign the prototypes of intrinsic types wie Objekt, Nummer, etc. Sie können nur neue Eigenschaften anhängen.

> Number.prototype 
    -> Number 
> Number.prototype = {} // Reassignment fails 
    -> Object 
> Number.prototype 
    -> Number 
> Number.prototype.objSayHello = 'hi' // Appending succeeds 
    -> 'hi' 
> n = new Number(); n.objSayHello 
    -> 'hi' 

Wenn Sie Ihre eigenen Objekte verwenden, dann können Sie den Prototyp (Anmerkung: Neuzuordnung der Prototyp nur neue Objekte betreffen, nicht vorhandene) aktualisieren oder neu zuweisen.

Ändern Sie keine intrinsischen Prototypen! Dies ist eine "schlechte Sache", weil es schwer zu findende Nebenwirkungen verursachen kann. Wenn Sie einen Basistyp mit neuen Eigenschaften benötigen, erstellen Sie dann ein neues Objekt mit dem Prototyp zum Grunde Objekt zeigt:

NewObject = function() {}; 
NewObject.prototype = Object.prototype; 
NewObject.prototype.value = 123; 

Jetzt haben Sie ein Konstruktor, die neuen Objekte erstellt werden, die Eigenschaften sowohl von seinem eigenen Prototyp erbt (zB "Wert") sowie der Objekt-Prototyp ('toString', 'hasOwnProperty' ...).