2013-08-02 11 views
21

jqueryでobject.createを使用して日付ドロップダウンを作成するプラグインで問題が発生しました。コードここObject.createはie8でサポートされていません

SCRIPT438: Object doesn't support property or method 'create' 

されています:良い仕事はIE8以上、クロスブラウザのために周りの互換性がありますどのような

var dropdateobj = Object.create(dropdatefuncs); 
dropdateobj.create(options, this); 
$.data(this, 'dropdate', dropdateobj); 

を私はちょうどそれがのエラーを投げていることをIE 8に気づきましたか?

ありがとうございます!

+0

難しいことではありません。 –

+0

これは、GoogleでObject.create IE8を検索するときに表示される最初の質問です。 +1 – cheeesus

答えて

37

は、あなたが同様に他のES5の機能に依存する必要があるかもしれません良いチャンスがあります。したがって、ほとんどの場合、適切な解決策はes5-shimを使用することです。

Object.createはあなたが必要とする唯一のものであり、あなたが唯一の純粋なセットアッププロトタイプチェーンをするためにそれを使用する場合は、ここでは最初の引数としてnullをサポートしていないと第二propertiesをサポートしていません軽量ポリフィルです引数。

15.2.3.5 Object.create(O [プロパティ])

作成機能は、指定されたプロトタイプを持つ新しいオブジェクトを作成します。

はここで仕様です。 create関数が呼び出されると、次のステップが実行されます。

Type(O)がObjectでないかNullがTypeError例外をスローした場合。 Objectが内蔵標準コンストラクタ

セット[[プロトタイプ]]内部プロパティの名前 付きである)(式 新しいオブジェクトであるかのように

objは新しいオブジェクトを作成した結果とします引数のプロパティが未定義存在しない場合にはO.

にOBJの、OBJ、プロパティの引数で Object.defineProperties標準の組み込み関数を呼び出すことであるかのようにobjに独自の プロパティを追加します。

返品obj。

はここで軽量な実装です:あなたが見れば、シムを見つけることが

if (!Object.create) { 
    Object.create = function(o, properties) { 
     if (typeof o !== 'object' && typeof o !== 'function') throw new TypeError('Object prototype may only be an Object: ' + o); 
     else if (o === null) throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument."); 

     if (typeof properties != 'undefined') throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument."); 

     function F() {} 

     F.prototype = o; 

     return new F(); 
    }; 
} 
+2

2番目のパラメータはジョークです。誰かが実際に冗長な構文を使って実際のコードでオブジェクトを作成しているのであれば、私は疑問に思います。 – Esailija

+0

@plalx:MDNは共同編集されています。 「公式」のものはありません。私はMDNに*真剣に*欠陥のあるコードをいくつか見てきました。 ([Array#forEach]ページ(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)の最初の「互換性」の例を参照してください。非常に間違っています。)少なくとも可能な限り努力するものについては、[es5-shim](https://github.com/kriskowal/es5-shim/)の実装を参照してください。 –

+0

@Esailija:現在、馬鹿馬鹿しく冗長な構文が、プロパティデスクリプタを定義するために利用できる唯一の構文です。 –

19

this oneを含むいくつかのシムがあります。

が完全にシムすることはできません Object.create、しかし、とりわけ、それはあなたがすべての事前ES5ブラウザ上で行うことはできませんゲッターとセッター、非可算のプロパティまたはプロパティを作成することができますので、注意することを

。 (独占的な構文を使用してES5以前のブラウザでゲッタとセッタを行うことはできますが、IE8ではそうは信じられません)。疑似シームにすることしかできません。

しかし、擬似シムはあなたが引用したユースケースのために行います。ただ、完全を期すため、ここではシムことができる一部の簡単なバージョン

です:あなたはObject.createが必要な場合は

if (!Object.create) { 
    Object.create = function(proto, props) { 
     if (typeof props !== "undefined") { 
      throw "The multiple-argument version of Object.create is not provided by this browser and cannot be shimmed."; 
     } 
     function ctor() { } 
     ctor.prototype = proto; 
     return new ctor(); 
    }; 
} 
+0

+1説明を提供します;) – plalx

+0

偉大な説明、ありがとう。 –

+1

このpolyfillは、両方ともトリックですが、plalxが他の答えで提案したpolyfillよりもはるかに読みやすいです。 –

関連する問題