Object.seal()

admin發表於2018-09-14

此方法可以將物件密封起來。

密封物件的特點如下:

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

(2).物件的現有屬性被設定為不可配置,也就是configurable屬性值為true。

(3).如果物件的屬性是可寫的,那麼屬性值可寫。

(4).物件的可列舉性不受影響。

(5).物件繼承自原型鏈的屬性不受影響。

關於configurable用法參閱configurable、enumerable和writable一章節。

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

ES5新增此方法。

語法結構:

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

引數解析:

(1).obj:必需,規定要被密封的物件。

瀏覽器支援:

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

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

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

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

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

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

程式碼例項如下:

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201809/14/102622jkc8a18s0swwwcmm.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

直接量方式建立的屬性預設都是可讀寫的。

只要原來是可讀寫的,那麼密封后也是可讀寫。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
"use strict"
let antzone = {
  webName: "螞蟻部落",
  age:4,
  address:"青島市南區"
};
Object.seal(antzone);
antzone.url="http://www.softwhy.com";

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

a:3:{s:3:\"pic\";s:43:\"portal/201809/14/102701tde8li1x28h1hxzk.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

在嚴格模式下,如果對密封物件新增新屬性,那麼就會報錯。

在非嚴格模式下,新增屬性無效,但是不會報錯。

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201809/14/102738mttedf4yfrt4sf49.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到物件被密封之後,webName屬性的configurable特性值變為false,也就是不可配置。

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201809/14/102816rx87k5az77i7uizg.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到Object.seal方法對於原型鏈上的屬性沒有影響。

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201809/14/102854ja00cf02roagq0kg.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到,此方法對屬性的可列舉性沒有任何影響。