2011-03-29 20 views
2

假設我有這樣的事情在JavaScript:JavaScript:將屬性添加到密封對象應該會引發typeerror異常?

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

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

那麼,什麼是正確的行爲?這不是嚴格模式,所以我認爲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

任何想法?

+0

你爲什麼認爲它不應該拋出非嚴格的代碼? – 2011-03-29 22:11:00

+0

看看kangax鏈接到評論規範。 – 2011-03-30 09:25:41

回答

3

Object.seal做兩件事情trows:拋出
火狐4。

1)將對象的內部[[Extensible]]屬性設置爲false。

2)迭代所有對象自己的屬性,並將其內部[[Configurable]]屬性設置爲false。

這幾乎意味着你不能添加任何屬性密封后的對象。請注意,現有的屬性仍然可以修改,只要對象未凍結(或者如果指定給的屬性不是明確不可寫)。

在您的情況,您要添加另一個屬性密封對象,所以在ES5,不嚴格,應該在ES5嚴格忽略,而它應該導致類型錯誤(你可以看到從11.3.1 (Simple Assignment);更具體地說,您可以追蹤到[[CanPut]],它幾乎可以返回[[Extensible]]的值 - false - 在這種情況下,然後[[Put]]拋出,如果是嚴格模式,或者沒有)。

因此,不應該在這裏拋出Chrome(在非嚴格模式下)。

+0

感謝您的鏈接。我進入了規範並瞭解[[canput]]和[[put]]是如何工作的。問題在於找到[[put]]以非嚴格模式被調用的方式(因爲異常拋出是由傳遞給它的最後一個參數決定的)。順便說一句,註釋版本真的幫助這裏!再次感謝。 – 2011-03-30 08:35:16

1

IE9:不拋出
鉻:只有嚴格模式代碼

相關問題