列挙を構成可能にする「新しい」Object.create に関する投稿を見ています。ただし、これは Object.defineProperty メソッドに依存しています。このメソッドのクロス ブラウザー実装が見つかりません。
古い Object.create の作成に行き詰っていませんか? IE6/7で動かないものは書けません。
列挙を構成可能にする「新しい」Object.create に関する投稿を見ています。ただし、これは Object.defineProperty メソッドに依存しています。このメソッドのクロス ブラウザー実装が見つかりません。
古い Object.create の作成に行き詰っていませんか? IE6/7で動かないものは書けません。
Object.create
ECMAScript3環境でECMAScript5メソッドからエミュレートできないことがいくつかあります。
ご覧のとおり、E3ベースの実装ではプロパティ属性を変更する方法がないため、プロパティ引数を使用すると問題が発生します。
@Raynosが述べたように、このObject.defineProperty
メソッドはIE8で機能しますが、部分的にはDOM要素でのみ使用できます。
また、アクセサプロパティは問題を引き起こします。これらは、 /などの広くサポートされている非標準のメソッドで模倣できますが、プロパティ属性を変更することはできません。__defineGetter__
__defineSetter__
プロパティ記述子以外のもう1つの問題は、Object.create
メソッドが引数として受け入れnull
て、何からも継承しないオブジェクトを作成できることです。
これは、 CrockfordのObject.create
shimでエミュレートすることはできません。これは、演算子が-またはその他の非オブジェクト値-を含むプロパティをnew
持つコンストラクター関数で使用される場合、新しく作成されたオブジェクトはデフォルトでとにかく継承するためです。prototype
null
Object.prototype
一部の実装(V8、Spidermonkey、Rhinoなど)では、[[Prototype]]__proto__
を設定するために使用できる設定可能なプロパティがありますが、これnull
も非標準であり、IEでは機能しません。 。
古いブラウザをターゲットにしてこれらの機能を使用しないようにする場合は、これらの環境で正しく動作させる方法がないため、お勧めします。
プロパティObject.create
引数を使用せずに、を使用したい場合は可能ですが、エミュレートできないものを検出することをお勧めします。
以下は、クロックフォードのシムのより安全なバージョンです:Object.create
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;
};
})();
}
とにかく、慎重に使用してください。
優れた defineProperty() の実装が必要な場合は、https://github.com/kriskowal/es5-shimをご覧ください。
残念ながら、ES3 環境で列挙を構成可能にすることはできません。この shim を使用すると、どちらの環境でも API を呼び出すことができますが、ES3 でもプロパティを列挙できます。
それが価値があるもののために、
Object.definePropertyは、ie8およびFF4で機能します。
これは、スニフを機能させて、6/7から8/9へのアップグレードが今後数年以内に行われることを期待しているので役立つ場所に実装する価値があることを意味します。
注意すべきもう1つの点は、dontEnumプロパティにJScriptのバグがあることです。
IEでdontEnumプロパティを使用する方法を回避する必要があります。
[編集]:
Internet ExplorerのドキュメントとES5仕様へのリンク(ページ122、15.2.3.6)は次のとおりです。