Es gibt mehrere Dinge, die man nicht aus der ECMAScript 5 Object.create
Methode emulieren in einer ECMAScript 3-Umgebung.
Wie Sie gesehen haben, wird Ihnen das Argument Eigenschaften Probleme bereiten, da es in E3-basierten Implementierungen kein Weg gibt, um die Eigenschaftenattribute zu ändern.
Die Object.defineProperty
Verfahren nach @Raynos erwähnt, arbeitet auf IE8, aber teilweise , kann es nur in DOM-Elemente verwendet werden.
Auch Accessoreigenschaften werden Sie Probleme geben, sie mit weitgehend unterstützt Nicht-Standard-Methoden nachgeahmt werden könnte wie __defineGetter__
/__defineSetter__
, aber wieder, Sie kann die Eigenschaft nicht Attribute ändern.
Ein weiteres Problem neben den Eigenschaftendeskriptoren ist, dass die Object.create
-Methode null
als Argument akzeptieren kann, um ein Objekt zu erstellen, das nichts erbt.
Dies kann nicht mit den Crockford's Object.create
shim emuliert werden, denn wenn der new
Operator mit einer Konstruktor-Funktion verwendet wird, die eine prototype
Eigenschaft enthält null
-oder andere nicht-Objekt wert- erben, das neu erstellte Objekt aus Object.prototype
hat sowieso standardmäßig.
In einigen Implementierungen -V8, Spidermonkey, Rhino, etc ...- sie haben eine setteable __proto__
Eigenschaft, die verwendet werden könnten, ein null
[[Prototyp]] auf, aber auch hier, das ist nicht-Standard, und sicher Es wird nie auf IE arbeiten.
Ich würde empfehlen, wenn Sie alte Browser verwenden möchten, um diese Funktionen nicht zu verwenden, da es keine Möglichkeit gibt, sie in diesen Umgebungen ordnungsgemäß zu funktionieren.
Wenn Sie noch Object.create
verwenden, ohne die Eigenschaften Argument zu verwenden, Sie könnten, aber ich würde Ihnen empfehlen, die Dinge zu erkennen, die nicht nachgeahmt werden kann.
if (typeof Object.create != 'function') {
(function() {
var F = function() {};
Object.create = function (o) {
if (arguments.length > 1) { throw Error('Second argument not supported');}
if (o === null) { throw Error('Cannot set a null [[Prototype]]');}
if (typeof o != 'object') { throw TypeError('Argument must be an object');}
F.prototype = o;
return new F;
};
})();
}
Wie auch immer, es sorgfältig verwenden:
Die folgende wäre eine sichere Version der Crockford's Object.create
shim sein.
Es gibt immer Chrome-Frame! – kzh