1

次のコードがそのような「奇妙な」結果をもたらす理由に興味があります。

var f = function() {}
$.extend(f, Object.freeze({foo1:"bar1"}));

Chrome での入力 (アップデートを参照してください - ここと下のChromeではなく、 Chromiumにあります) コンソール:

> f.foo1

Chrome コンソールの結果は次のとおりです。

> undefined

さらに、次のことを試してください。

$.extend(f, {foo2:Object.freeze([1,2,3])});

Chrome コンソールに次のように入力します。

> f.foo2

結果はさらに奇妙です。

> function Object() { [native code] }

私は何を間違っていますか?なぜ usingObject.freeze()にこれらの意味があるのでしょうか?

更新: Chromeではなく、Chromium 18 (執筆時点での Ubuntu の最新版)。これは実装上のバグだと思います。唯一の答えを受け入れますが、ブラウザで効果を再現できます。

4

1 に答える 1

0

これはあなたが説明したようには機能しないと思います:ここで jsfiddle を見てください

次のようにコードを実装します。

var f = function() {}
$.extend(f, Object.freeze({
  foo1: "bar1"
}));

$.extend(f, {
  foo2: Object.freeze([1, 2, 3])
});

$(document).ready(function() {
  document.getElementById('div').innerHTML = f.foo1.toString() + '<br/>' + f.foo2.toString()
});​

オブジェクトのフリーズは、関数への属性および関数の追加を妨げませんf。実際にフリーズするオブジェクトをフリーズするだけです。jQueryextendは最初の引数を取り、それを 2 番目のプロパティで拡張するため、ケース内の凍結されたオブジェクトは変更されません。

于 2012-07-16T16:07:04.593 に答える