Was ist der Sinn der Prototypmethode?

10

Ich lese gerade Javascript: The Good Parts durch und habe mich bemüht, mich mit dem Abschnitt über Prototypen vertraut zu machen .

Nach ein wenig googeln bin ich zu dem Schluss gekommen, dass Objekte nach der Objektdeklaration mit Eigenschaften versehen werden sollen .

Bei Verwendung dieses Skripts aus w3schools stellte ich fest, dass das Entfernen der Zeile zum Hinzufügen der Prototyp-Eigenschaft keine Auswirkungen hatte . Worum geht es also?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write (fred.salary);

Milder Flaum
quelle
4
@ Raynos gut gesagt, aber schlagen Sie auch einen Ersatz vor, zB MDN docs: developer.mozilla.org/en/JavaScript
StuperUser

Antworten:

13

So funktioniert der Prototyp nicht. Der Prototyp wird in der Prototypenkette verwendet.

Wenn Sie versuchen, eine Eigenschaft für ein Objekt abzurufen, wird das Objekt auf diesen Eigenschaftsnamen überprüft. Wenn es nicht existiert, wird es im Prototyp angezeigt.

Beispiel:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

Der Punkt des Prototyps ist also einfach die Wiederverwendung und Vererbung von Code.

Raynos
quelle
Okay, ich verstehe das jetzt. Aber ich habe versucht, eine Eigenschaft dynamisch hinzuzufügen, und es sagt mir prototype is undefined---o.prototype.newProp = "mutts nuts";
Mild Fuzz
3
@MildFuzz oist ein Objekt. Die .prototypeEigenschaft wird für Funktionen verwendet. Ignorieren Sie sie. Tun o.newProp = "mutts nuts"
Sie es
7

Als Sie dies getan haben fred.salary=20000, haben Sie das Gehaltsattribut nur zu Fred hinzugefügt. Bei Verwendung des Prototyps haben alle Mitarbeiter, die Sie fortan erstellen, das Gehaltsattribut.

Angenommen, Sie haben 100 Instanzen von Mitarbeitern und möchten allen ein Gehaltsattribut hinzufügen. Sie können es manuell durchlaufen, über jeden Mitarbeiter iterieren und es hinzufügen. Oder Sie könnten einen Prototyp verwenden und festlegen, ob für alle.

Der Prototyp ist nützlich, wenn Sie Funktionen für etwas bereitstellen möchten, das bereits vorhanden ist. Angenommen, Sie möchten Arrays eine benutzerdefinierte Methode hinzufügen. Sie würden so etwas tun wie:

Array.prototype.my_custom_method = function() {...}

Von da an steht allen von Ihnen erstellten Arrays diese Methode zur Verfügung.

adivasile
quelle
3
Ich bin überrascht, dass niemand erwähnt hat, dass dies dazu dient, die Speichernutzung gering zu halten. Wenn Sie ein komplexes Objekt mit viel Code implementieren müssen, möchten Sie nicht, dass der Code in jeder Instanz des Objekts wiederholt wird. Natürlich sind die Dateneigenschaften in jedem Fall wahrscheinlicher unterschiedlich, aber normalerweise möchten Sie nur eine Kopie des Codes, also fügen Sie ihn in den Prototyp ein.
Dominic Cronin
1
IMO ist dies bei weitem die beste Antwort.
Der Muffin-Mann
5

Vielleicht möchten Sie sich diesen Artikel ansehen .

Eine prototypbasierte Sprache hat den Begriff eines prototypischen Objekts, eines Objekts, das als Vorlage verwendet wird, um die anfänglichen Eigenschaften für ein neues Objekt abzurufen. Jedes Objekt kann seine eigenen Eigenschaften angeben, entweder beim Erstellen oder zur Laufzeit. Darüber hinaus kann jedes Objekt als Prototyp für ein anderes Objekt zugeordnet werden, sodass das zweite Objekt die Eigenschaften des ersten Objekts gemeinsam nutzen kann.

Wenn Sie einem Objekt, das als Prototyp für eine Reihe von Objekten verwendet wird, eine Eigenschaft hinzufügen, erhalten die Objekte, für die es sich um den Prototyp handelt, auch die neue Eigenschaft.

Dies ist einer der Hauptvorteile einer prototypbasierten Sprache gegenüber klassenbasierten.

Es ist auch einfach, bei Bedarf eine klassische OO-Vererbung mit JS zu erhalten, aber es ist oft schwierig, ein Prototypmodell für eine Sprache zu erhalten, die es nicht standardmäßig implementiert.

Jose Faeti
quelle
3
+1 für Artikel über
klassenbasierte