20

以下に示すように Object.defineProperty について尋ねます。

function testComponent(){
    var testProperty;
    Object.defineProperty(this, "testProperty",
    {
        get : function()
        {
           return testProperty;
        },
        set : function(val)
        {
          testProperty = val;
        }
    });
}

次のように使用されます。

testObject = new testComponent();
testObject.testProperty = "testValue";

私がこれまでに見たものに基づいて、運がなかったes5-shimを使用しようとしたため、クロス ブラウザー ソリューションがないように見えますが、確認したいと思います。この投稿への参照も見つけましたが、私のテストは IE 7 & 8 でも失敗します。

数か月前に S/O のどこかで関連する質問を調べたのを覚えています。誰かが回答でこれに対する解決策を書いているのを見たと思います。ゲッター/セッターの一般的な回避策もいただければ幸いです。アイデアは、メソッドを介してパラメーターの変更を渡すことなく、オブジェクトのゲッター セッターに相当するものを必要とするということです。IE6 は必要ありませんが、IE7+ ff 3.6+ などの範囲のブラウザーをサポートしたいと考えています。


以下の QUnit テスト: ( jsFiddles )

(これらは、IE 7 と 8 を除く、私のマシンのすべてのブラウザーで通過します。

defineProperty の直接使用、シムなし:
http://jsfiddle.net/uSYFE/

ES5シムを使用してフィドルします。私がする必要があるのはそれを含めることだけだと思いますか? :
http://jsfiddle.net/hyperthalamus/ntwDy/

IE推奨ソリューションを使用してフィドル
http://jsfiddle.net/hyperthalamus/xfvz3/

4

3 に答える 3

18

ES5-shimによると:

/!\ Object.defineProperty

このメソッドは、「書き込み可能」、「列挙可能」、および「構成可能」プロパティの設定に暗黙のうちに失敗します。

記述子に「get」または「set」を使用して getter または setter を提供すると、「defineGetter」および「defineSetter」を欠いているエンジンでは警告なしで失敗します。これには、バージョン 8 までの IE のすべてのバージョンが含まれます。

IE 8 はこのメソッドのバージョンを提供しますが、DOM オブジェクトでのみ機能します。したがって、shim はインストールされず、DOM 以外のオブジェクトで「値」プロパティを設定しようとすると、サイレントに失敗します。

https://github.com/kriskowal/es5-shim/issues#issue/5

だからあなたはあなたの答えを知っています。DOM要素で実行できます。それだけです(IE8のみ)。

IE7 を動作させたい場合は、get/set メソッドを使用することをお勧めします。

于 2012-04-23T17:20:08.113 に答える
2

古い IE では、プロパティが dom オブジェクト (偽のタグであっても) であることを確認し、onPropertyChange を使用して通知を受け取る必要があります。詳細については、 John Dyerによるこの投稿を参照してください。

于 2012-06-06T15:44:23.717 に答える
0

私自身も同じ質問をしたことがあります。(こちらを参照してください。) IE8 以下では完全に可能ではないようです。それ以外の場合は、ES5 Shimが最適です。

于 2012-04-23T17:17:23.103 に答える