2

JavaScriptで次のようなものがあるとします。

var obj = { name: "Luis" };
Object.seal( obj );

obj.address = "Fx"; //what should happen here?

それで、正しい振る舞いは何ですか?strictモードではないので、obj.address行は単に無視されると思いました。ただし、Chromeをスローするため、そうではありません。私はV8のテストを見ていますが、厳密モードでのみスローする必要があるようです。

object.sealテストコード: http ://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/object-seal.js?spec = svn7379&r = 7379

そのファイルのコードは次のとおりです。

Object.seal(obj);

// Make sure we are no longer extensible.
assertFalse(Object.isExtensible(obj));
assertTrue(Object.isSealed(obj));

// We should not be frozen, since we are still able to
// update values.
assertFalse(Object.isFrozen(obj));

// We should not allow new properties to be added.
obj.foo = 42;
assertEquals(obj.foo, undefined);

ところで、厳密モードからのテストがあり、私の例では明らかにスローされます:http ://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/strict-mode.js?spec = svn7250&r = 7250

何か案は?

4

2 に答える 2

3

Object.seal2つのことをします。

1) オブジェクトの内部 [[Extensible]] 属性を false に設定します。

2) オブジェクト自身のすべてのプロパティを繰り返し処理し、内部の [[Configurable]] 属性を false に設定します。

これは、オブジェクトが封印された後は、オブジェクトにプロパティを追加できないことを意味します。オブジェクトが凍結されていない限り (または、割り当てられているプロパティが明示的に書き込み不可にされていない場合)、既存のプロパティを変更できることに注意してください。

あなたの場合、シールされたオブジェクトに別のプロパティを追加しているため、ES5-non-strict では無視する必要がありますが、ES5-strict ではTypeErrorになるはずです(11.3.1 (Simple Assignment)からわかるように;より具体的には、[[CanPut]] まで追跡できます。これは [[Extensible]] の値をほとんど返します — この場合は false — そして [[Put]] は、厳密モードの場合はスローするか、スローしません。 t)。

いいえ、Chrome はここで (厳密でないモードで) スローするべきではありません。

于 2011-03-30T04:17:01.320 に答える
1

IE9: スローしません
Chrome: スローし
ます Firefox 4: 厳密モードのコードでのみスローします

于 2011-03-29T22:13:36.740 に答える