簡體   English   中英

Javascript Object.seal()不會拋出異常

[英]Javascript Object.seal() does not throw an exception

我想模仿固定對象之類的東西,這樣就不會有新成員添加到對象中。 Object.seal(Obj)似乎是正確的方法,但是當我嘗試創建新成員時它不會拋出異常。 該成員不是創建的,但它是在沉默中發生的。

var O = { a: 111 }
Object.seal(O)
O.b = 222  <------ here the exception is expected (trying to add a member "b")
O.a = 333
console.log(O) // { a: 333 }

為什么有人想要這種沉默行為,為什么不拋出異常呢?

對密封對象的賦值行為隨瀏覽器而變化。 例如,最新版本的chrome就像你期望的那樣。 出於實際目的,可以安全地假設在嚴格模式下將成員添加到密封對象時僅拋出異常。

;(function () {
    'use strict';
    var O = { a: 111 }
    Object.seal(O)
    O.b = 222
    O.a = 333
    console.log(O) // { a: 333 }
}());

正如您所料,這個自動調用的匿名函數會拋出錯誤。 不幸的是,在舊瀏覽器上,您不能依賴於填充程序,例如https://github.com/kriskowal/es5-shim

事實上,Object原型上的seal方法避免了“TypeError”異常,但在調用時無聲地失敗。
從文檔:

這應該沒問題,除非您依賴於此方法的安全性和安全性規定,這在傳統引擎中是不可能獲得的。

對非可擴展對象的不存在屬性的賦值被指定為throw,但僅當賦值包含在strict-mode代碼中時。 ES5.1附件C第4項目。

如果您想確保獲得例外,請確保使用“use strict”標記代碼;

這種賦值不投入非嚴格代碼的原因是為了保持與符合ECMAScript標准的ES3(或更舊版本)版本的代碼的向后兼容性。 在ES5之前不存在可擴展/不可擴展的概念,但是一些實現可能暴露了無法添加屬性的主機對象(即,DOM對象)。 使用ES3語義,不會拋出對這些對象的賦值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM