Object.defineProperty in ES5?

8

Ich sehe Beiträge über ein 'neues' Object.create, das die Aufzählung konfigurierbar macht. Es beruht jedoch auf einer Object.defineProperty-Methode. Ich kann keine Cross-Browser-Implementierung für diese Methode finden.

Schreiben wir für das alte Object.create fest? Ich kann keine Dinge schreiben, die in IE6 / 7 nicht funktionieren.

    
Drew 30.09.2010, 13:11
quelle

3 Antworten

14

Es gibt verschiedene Dinge, die Sie nicht aus der ECMAScript 5 Object.create -Methode in einer ECMAScript 3-Umgebung emulieren können.

Wie Sie gesehen haben, wird Ihnen das Argument "properties" Probleme bereiten, da es in E3-basierten Implementierungen keine Möglichkeit gibt, die Eigenschaftenattribute zu ändern.

Die Object.defineProperty -Methode als @Raynos erwähnt, funktioniert auf IE8, aber teilweise , es kann nur in DOM-Elementen verwendet werden.

Auch Accessor-Eigenschaften werden Ihnen Probleme bereiten, sie könnten nachgeahmt werden mit weit verbreiteten, nicht standardmäßigen Methoden wie __defineGetter__ / __defineSetter__ , aber Sie können die Eigenschaftenattribute nicht ändern .

Ein weiteres Problem neben den Eigenschaftsdeskriptoren ist, dass die Object.create -Methode null als Argument akzeptieren kann, um ein Objekt zu erstellen, das nichts erbt.

Dies kann nicht mit Crockfords Object.create shim nachgebildet werden, da der Operator new verwendet wird Mit einer Konstruktorfunktion, die eine prototype -Eigenschaft enthält, die null enthält - oder irgendeinen anderen Nicht-Objekt-Wert - wird das neu erstellte Objekt standardmäßig von Object.prototype sowieso erben.

In einigen Implementierungen -V8, Spidermonkey, Rhino, etc ...- haben sie eine setzbare __proto__ Eigenschaft, die verwendet werden könnte, um ein null [[Prototype]] zu setzen, aber das ist wiederum nicht standardgemäß und wird auf IE niemals funktionieren.

Ich würde empfehlen, wenn Sie alte Browser als Ziel haben möchten, diese Funktionen nicht zu verwenden, da es keine Möglichkeit gibt, sie in diesen Umgebungen ordnungsgemäß zu betreiben.

Wenn Sie Object.create immer noch verwenden möchten, ohne das -Eigenschaften -Argument zu verwenden, könnten Sie jedoch empfehlen, die Dinge zu erkennen, die nicht emuliert werden können.

Das Folgende wäre eine sicherere Version des Crockfords Object.create shim :

%Vor%

Wie auch immer, benutze es vorsichtig.

    
CMS 02.10.2010, 07:19
quelle
4

Wenn Sie eine gute defineProperty () - Implementierung wünschen, werfen Sie einen Blick auf Ссылка

Leider können Sie die Aufzählung in einer ES3-Umgebung nicht konfigurieren. Mit diesem Shim können Sie die API in jeder Umgebung aufrufen, aber die Eigenschaften sind unter ES3 weiterhin aufzählbar.

    
Sean McMillan 03.04.2011 18:36
quelle
2

Für was es wert ist,

Object.defineProperty funktioniert in ie8 und FF4.

Dies bedeutet, es lohnt sich, Sniff zu verwenden und es dort zu implementieren, wo es nützlich ist, da Sie hoffen, dass das Upgrade von zB 6/7 auf 8/9 in den nächsten Jahren stattfinden wird.

Eine weitere Sache, vor der Sie sich in Acht nehmen sollten, ist, dass die Eigenschaft dontEnum einen Fehler in JScript

hat

Sie müssen umgehen, wie Sie die Eigenschaft dontEnum in IE verwenden.

[Bearbeiten]:

Hier finden Sie die Dokumentation für Internet Explorer und einen Link zum < a href="http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf"> ES5-Spezifikation (Seite 122, 15.2.3.6)

    
Raynos 30.09.2010 14:31
quelle