8

列挙を構成可能にする「新しい」Object.create に関する投稿を見ています。ただし、これは Object.defineProperty メソッドに依存しています。このメソッドのクロス ブラウザー実装が見つかりません。

古い Object.create の作成に行き詰っていませんか? IE6/7で動かないものは書けません。

4

3 に答える 3

14

Object.createECMAScript3環境でECMAScript5メソッドからエミュレートできないことがいくつかあります。

ご覧のとおり、E3ベースの実装ではプロパティ属性を変更する方法がないため、プロパティ引数を使用すると問題が発生します。

@Raynosが述べたように、このObject.definePropertyメソッドはIE8で機能しますが、部分的にはDOM要素でのみ使用できます。

また、アクセサプロパティは問題を引き起こします。これらは、 /などの広くサポートされている非標準のメソッドで模倣できますが、プロパティ属性を変更することはできません__defineGetter____defineSetter__

プロパティ記述子以外のもう1つの問題は、Object.createメソッドが引数として受け入れnullて、何からも継承しないオブジェクトを作成できることです。

これは、 CrockfordのObject.createshimでエミュレートすることはできません。これは、演算子が-またはその他の非オブジェクト値-を含むプロパティをnew持つコンストラクター関数で使用される場合、新しく作成されたオブジェクトはデフォルトでとにかく継承するためです。prototypenullObject.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;
    };
  })();
}

とにかく、慎重に使用してください。

于 2010-10-02T07:19:05.900 に答える
4

優れた defineProperty() の実装が必要な場合は、https://github.com/kriskowal/es5-shimをご覧ください。

残念ながら、ES3 環境で列挙を構成可能にすることはできません。この shim を使用すると、どちらの環境でも API を呼び出すことができますが、ES3 でもプロパティを列挙できます。

于 2011-04-03T18:36:28.323 に答える
2

それが価値があるもののために、

Object.definePropertyは、ie8およびFF4で機能します。

これは、スニフを機能させて、6/7から8/9へのアップグレードが今後数年以内に行われることを期待しているので役立つ場所に実装する価値があることを意味します。

注意すべきもう1つの点は、dontEnumプロパティにJScriptのバグがあることです。

IEでdontEnumプロパティを使用する方法を回避する必要があります。

[編集]:

Internet ExplorerのドキュメントとES5仕様へのリンク(ページ122、15.2.3.6)は次のとおりです。

于 2010-09-30T14:31:16.000 に答える