Object.isSealed()

admin發表於2018-09-17

Object.isSealed方法可以判斷一個物件是否是密封的。

被密封物件的特點如下:

(1).物件不可擴充套件,也就是不能夠新增新的屬性或者方法。

(2).物件的已有屬性不能被刪除。

(3).物件自有屬性特性不可以重新配置,如果屬性原本是可寫的,那麼可以修改屬性值。

關於屬性特性可以參閱configurable、enumerable和writable一章節。

ES5新增此方法。

更多Object物件內容參閱JavaScript Object 物件一章節。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
Object.isSealed(obj)

引數解析:

(1).obj:必需,要判斷的物件。

瀏覽器相容:

(1).IE9+瀏覽器支援此方法。

(2).edge瀏覽器支援此方法。

(3).谷歌瀏覽器支援此方法。

(4).火狐瀏覽器支援此方法。

(5).opera瀏覽器支援此方法。

(6).safria瀏覽器支援此方法。

程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {
  webName:"螞蟻部落",
  age:4,
  address:"青島市南區"
};
console.log(Object.isSealed(antzone));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/17/115750uzs2llmo2958oum8.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

列印結果為false,說明物件不是封閉的,新建立物件預設不是密封的。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {};
Object.preventExtensions(antzone);
console.log(Object.isSealed(antzone));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/17/115824rboig7ex60t7inee.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

通過Object.preventExtensions方法將空物件設定為不可擴充套件。

結果Object.isSealed方法的返回值是true,再來看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {
  webName:"螞蟻部落",
  age:4,
  address:"青島市南區"
};
Object.preventExtensions(antzone);
console.log(Object.isSealed(antzone));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/17/115901e2i26jic26u0d0iu.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

如果不是空物件,將物件設定為不可擴充套件,但依然不是密封物件。

密封物件不但是不可擴充套件的,同時物件屬性的特性不可更改,且屬性不可刪除。

一個空物件,由於沒有屬性,那就談不上屬性的刪除和屬性特性的更改。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let antzone = {
  url: "http://www.softwhy.com"
};
Object.preventExtensions(antzone);
Object.defineProperty(antzone, "url", { configurable: false });
console.log(Object.isSealed(antzone));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/17/115950bn2kzpdsk2syxeit.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).通過Object.preventExtensions方法將物件設定為不可擴充套件。

(2).然後再通過Object.defineProperty設定物件的url屬性為不可配置,設定為不可配置之後,那麼屬性就不能被刪除,屬性特性也就不能被修改,又由於物件只有這個一個屬性,那麼通過上面兩步設定之後,antzone物件就滿足了封閉物件的特點,最終列印true。

ES5與ES2015區別:

ES5中,如果方法的引數不是一個物件,那麼會報錯。

ES2015中,如果方法的引數不是一個物件,那此方法直接返回此引數。