Object構造函數的方法 之 Object.preventExtensions

Object.preventExtensions(obj)

讓一個對象變得不可擴展,也就是永遠不能在添加新的屬性

  • obj
    • 將要變得不可擴展的對象。
  • 返回值
    • 已經不可擴展的對象。
描述
  • 如果一個對象可以添加新的屬性,則這個對象是可擴展的。Object.preventExtensions()將對象標記爲不可擴展,這樣它將永遠不會增加新的屬性。
  • 注意,一般來說,不可擴展對象的屬性可能仍然可被刪除。嘗試將新屬性添加到不可擴展對象將靜默失敗或拋出TypeError
  • Object.preventExtensions()僅阻止添加自身的屬性。但其對象類型的原型依然可以添加新的屬性
  • 該方法使得目標對象的[[prototype]] 不可變。任何重新賦值[[prototype]] 操作都會拋出TypeError。這種行爲只針對內部的[[prototype]]屬性,目標對象的其他屬性將保持可變
  • 一旦將對象變爲不可擴展的對象,就再也不能使其可擴展
示例
// Object.preventExtensions()將原對象變得不可擴展,並且返回原對象
var obj = {}
var obj2 = Object.preventExtensions(obj)
console.log(obj === obj2) // true

// 字面量方式定義的對象默認是可擴展的
var empty = {}
Object.isExtensible(empty) //true
// 但是可以改變
Object.preventExtensions(empty)
Object.isExtensible(empty) // false

// 使用Object.defineProperty方法爲一個不可擴展的對象增加新屬性會拋出異常
var nonExtensible = {
  removable: true
};
Object.preventExtensions(nonExtensible);
// Object.defineProperty(nonExtensible, 'new', {
//   value: 857857
// }) // 拋出異常:Cannot define property new, object is not extensible

// 在嚴格模式下,爲一個不可擴展對象增加新屬性會拋出TypeError
function fail() {
  "use strict";
  nonExtensible.newProperty = "FAIL"; // throws a TypeError: Cannot add property newProperty, object is not extensible
}
// fail();


// 不可擴展對象的原型是不可變的:
var fixed = Object.preventExtensions({})
fixed.__proto__ = { // <Object> is not extensible
  oh: 'hai'
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章