Object.preventExtensions() 用來避免物件被新增新的屬性。

語法

Object.preventExtensions(obj)

參數

obj
要被用作無法擴充的物件。

描述

物件如果可以被增加新的屬性,我們稱它可以被擴充(extensible)。Object.preventExtensions() 標註物件使它無法被擴充,所以在它被標註為無法擴充當下,它將無法再增加新的屬性。不過注意一點,在一般狀況下,被標註為無法擴充的物件,其屬性仍可被刪除(deleted)。嘗試去增加屬性將會導致失敗,可能會沒有結果產生,或是傳回一個 TypeError (最常見,但並不是一定,當在strict mode)。

Object.preventExtensions() 只有避免物件被增加屬性,屬性仍可以被增加至 object prototype 。不過,呼叫 Object.preventExtensions() 使用在物件上,就可以使其 __proto__ 屬性無法被擴充。

如果能把可擴充物件,轉成無法擴充物件,在 ECMAScript 5 規範中,它並沒有任何方法轉回來。

範例

// Object.preventExtensions 傳回一個被無法擴充的物件
var obj = {};
var obj2 = Object.preventExtensions(obj);
obj === obj2; // true

// 預設下,物件可以被擴充
var empty = {};
Object.isExtensible(empty); // === true

// ...但是以下情況之後,無法再被變更。
Object.preventExtensions(empty);
Object.isExtensible(empty); // === false

// Object.defineProperty throws 當為無法擴充的物件增加屬性
var nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, 'new', { value: 8675309 }); // throws a TypeError

// 在 strict mode 中,嘗試去新增屬性給無法擴充物件,將 throws 出一個 TypeError。
function fail() {
  'use strict';
  nonExtensible.newProperty = 'FAIL'; // throws a TypeError
}
fail();

// EXTENSION (only works in engines supporting __proto__
// (which is deprecated. Use Object.getPrototypeOf instead)):
// A non-extensible object's prototype is immutable.
var fixed = Object.preventExtensions({});
fixed.__proto__ = { oh: 'hai' }; // throws a TypeError

筆記

在ES5中,如果給祝個方法的參數為非物件,它將造成一個 TypeError 。不過在 ES6 中,非物件參數會被正常處理。另外,如果它原本就是個無法擴充物件,就只是回傳本身。

Object.preventExtensions(1);
// TypeError: 1 is not an object (ES5 code)

Object.preventExtensions(1);
// 1                             (ES6 code)

規範

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.preventExtensions' in that specification.
Standard Initial definition. Implemented in JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.preventExtensions' in that specification.
Standard  
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.preventExtensions' in that specification.
Draft  

瀏覽器相容度

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 6 4.0 (2.0) 9 12 5.1
ES6 behavior for non-object argument 44 35.0 (35.0) 11 31 ?
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support ? ? ? ? ? ?
ES6 behavior for non-object argument ? ? 35.0 (35.0) ? ? ?

閱讀更多

文件標籤與貢獻者

此頁面的貢獻者: ALiangLiang
最近更新: ALiangLiang,