ich der größte Vorteil denke, ist in der Lage sein, um zu steuern, was beim Auflisten der Eigenschaften eines Objekts angezeigt wird, z. B. for in
oder Object.keys()
.
MDN erklärt es gut mit Object.defineProperty
: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty
So normal, wenn die Menschen, ein Verfahren zu Object
, wie ein polyfill für einige Verfahren nicht in alten Browsern unterstützt hinzufügen wollen, sie die .prototype
ändern. Aber das macht die Eigenschaft aufzählbar und vermasselt, was in Schleifen/Schlüssel-Sammlung zurückgegeben wird (ohne .hasOwnProperty
... die nicht jeder verwendet).
Anstatt also so etwas wie:
Object.prototype.myMethod = function() {
alert("Ahh");
};
könnten Sie Object.defineProperty
verwenden explizit zu sagen, dass es nicht zählbare zu haben:
Object.defineProperty(Object.prototype, 'myMethod', {
value: function() {
alert("Ahh");
},
enumerable: false
});
So zum Beispiel, wenn Sie verwenden for (var key in obj)
„myMethod "wird kein aufgezähltes Objekt sein, und Sie müssen sich keine Sorgen über die Verwendung von .hasOwnProperty
machen. Das Hauptproblem dabei ist, dass einige Browser es natürlich nicht unterstützen: http://kangax.github.com/es5-compat-table/ und dass nicht alle Bibliotheken/Code es benutzen, so dass man sich nicht immer auf externe Bibliotheken/Code verlassen kann, um es richtig und ständig zu benutzen.
Sie können jederzeit auf eine nicht aufzählbare Eigenschaft zugreifen, sie wird nur beim Aufzählen der Objekteigenschaften angezeigt - das ist der Hauptpunkt.
Und ich glaube, dass alle "vordefinierten" Eigenschaften von Objekten nicht aufzählbar sind. Damit meine ich eigentlich nur native Eigenschaften, die nicht unbedingt geerbt oder erzeugt werden müssen. Also mit Ihrem Beispiel, pop
und push
wird nicht über aufgezählt werden, aber Array.prototype.indexOf
wird sein, wenn es als ein Polyfill auf einem alten Browser erstellt wird, der diese Methode nicht unterstützt ...was natürlich vermieden werden kann, indem ich Object.defineProperty
wie mein Beispiel oben verwende. Ein anderes Beispiel ist die length
-Eigenschaft, die nicht überzählig ist.
Hier ist ein Beispiel im allgemeinen: http://jsfiddle.net/aHJ3g/
Die Verwendung des Wortes Object.keys
ist wichtig: „Gibt ein Array einer eigenen enumerable Eigenschaften des gegebenen Objekts in der gleichen Größenordnung wie die von einem for-in
Schleife (die Differenz zur Verfügung gestellt dass eine for-in
Schleife auch Eigenschaften in der Prototypkette aufzählt). " - von MDN - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
Ich denke, der Hauptvorteil 'für in' zu machen, ist Schleifen sicher - das Objekt wird nicht angezeigt, wenn über das Objekt iterieren. Vielleicht vergesse ich, was Aufzählbarkeit tut ... – Ian
Related: [Was sind die Vorteile und Gefahren des Hinzufügens von Methoden zu Object.prototype in Javascript?] (Http://stackoverflow.com/questions/3832617/what-are-the Vorteile-und-Gefahren-von-Hinzufügen-Methoden-zu-Objekt-Prototyp-in-Javas? Rq = 1). –