Object.preventExtensions()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
ÐеÑод Object.preventExtensions() пÑедоÑвÑаÑÐ°ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ новÑÑ
ÑвойÑÑв к обÑекÑÑ (Ñо еÑÑÑ, пÑедоÑвÑаÑÐ°ÐµÑ ÑаÑÑиÑение ÑÑого обÑекÑа в бÑдÑÑем).
ÐнÑеÑакÑивнÑй пÑимеÑ
const object1 = {};
Object.preventExtensions(object1);
try {
Object.defineProperty(object1, "property1", {
value: 42,
});
} catch (e) {
console.log(e);
// Expected output: TypeError: Cannot define property property1, object is not extensible
}
СинÑакÑиÑ
Object.preventExtensions(obj);
ÐаÑамеÑÑÑ
obj-
ÐбÑекÑ, коÑоÑÑй нÑжно ÑделаÑÑ Ð½ÐµÑаÑÑиÑÑемÑм.
ÐозвÑаÑаемое знаÑение
ÐбÑекÑ, коÑоÑÑй делаеÑÑÑ Ð½ÐµÑаÑÑиÑÑемÑм.
ÐпиÑание
ÐбÑÐµÐºÑ Ð½Ð°Ð·ÑваеÑÑÑ ÑаÑÑиÑÑемÑм, еÑли к Ð½ÐµÐ¼Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð½Ð¾Ð²Ñе ÑвойÑÑва. Object.preventExtensions() помеÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ°Ðº неÑаÑÑиÑÑемÑй, Ñак ÑÑо он никогда не бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð´ÑÑгиÑ
ÑвойÑÑв, кÑоме ÑеÑ
, ÑÑо бÑли Ñ Ð½ÐµÐ³Ð¾ на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð¼ÐµÑки его неÑаÑÑиÑÑемÑм. ÐбÑаÑиÑе внимание, ÑÑо, в обÑем ÑлÑÑае, ÑвойÑÑва неÑаÑÑиÑÑемого обÑекÑа вÑÑ ÐµÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑдаленÑ. ÐопÑÑка добавиÑÑ Ð½Ð¾Ð²Ñе ÑвойÑÑва к неÑаÑÑиÑÑÐµÐ¼Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ Ð¿Ð¾ÑеÑÐ¿Ð¸Ñ Ð½ÐµÑдаÑÑ, либо молÑа, либо Ñ Ð²ÑбÑаÑÑванием иÑклÑÑÐµÐ½Ð¸Ñ TypeError (как пÑавило, но не обÑзаÑелÑно, ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² ÑÑÑогом Ñежиме).
ÐеÑод Object.preventExtensions() пÑедоÑвÑаÑÐ°ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ ÑолÑко ÑобÑÑвеннÑÑ
ÑвойÑÑв. СвойÑÑва вÑÑ ÐµÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð² пÑоÑоÑип обÑекÑа. Ðднако, вÑзов Object.preventExtensions() на обÑекÑе Ñакже пÑедоÑвÑаÑÐ°ÐµÑ ÑаÑÑиÑение его ÑвойÑÑва Object.prototype.__proto__ .
ÐÑли пÑевÑаÑиÑÑ ÑаÑÑиÑÑемÑй обÑÐµÐºÑ Ð² неÑаÑÑиÑÑемÑй возможно, в ECMAScript 5 Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ ÑпоÑоба ÑделаÑÑ Ð¾Ð±ÑаÑнÑÑ Ð¾Ð¿ÐµÑаÑиÑ.
ÐÑимеÑÑ
// Object.preventExtensions возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑекÑ, коÑоÑÑй нÑжно ÑделаÑÑ Ð½ÐµÑаÑÑиÑÑемÑм.
var obj = {};
var obj2 = Object.preventExtensions(obj);
assert(obj === obj2);
// ÐбÑекÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑвлÑÑÑÑÑ ÑаÑÑиÑÑемÑми.
var empty = {};
assert(Object.isExtensible(empty) === true);
// ...но ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾.
Object.preventExtensions(empty);
assert(Object.isExtensible(empty) === false);
// Object.defineProperty вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение пÑи добавлении нового ÑвойÑÑва в неÑаÑÑиÑÑемÑй обÑекÑ.
var nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, "new", { value: 8675309 }); // вÑбÑоÑÐ¸Ñ TypeError
// Ð ÑÑÑогом Ñежиме, попÑÑки добавиÑÑ Ð½Ð¾Ð²Ñе ÑвойÑÑва к неÑаÑÑиÑÑÐµÐ¼Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ, бÑдÑÑ Ð²ÑбÑаÑÑваÑÑ Ð¸ÑклÑÑение TypeError.
function fail() {
"use strict";
nonExtensible.newProperty = "ÐШÐÐÐÐ"; // вÑбÑоÑÐ¸Ñ TypeError
}
fail();
// Ð ÐСШÐÐ ÐÐÐÐ (ÑабоÑÐ°ÐµÑ ÑолÑко в движкаÑ
, поддеÑживаÑÑиÑ
ÑвойÑÑво __proto__
// (коÑоÑое ÑвлÑеÑÑÑ ÑÑÑаÑевÑим. ÐÑполÑзÑйÑе вмеÑÑо него меÑод Object.getPrototypeOf)):
// неÑаÑÑиÑÑемÑе обÑекÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñ.
var fixed = Object.preventExtensions({});
fixed.__proto__ = { oh: "hai" }; // вÑбÑоÑÐ¸Ñ TypeError
ÐÑимеÑаниÑ
Ð ES5, еÑли аÑгÑÐ¼ÐµÐ½Ñ Ð¼ÐµÑода не ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом (ÑвлÑеÑÑÑ Ð¿ÑимиÑивнÑм знаÑением), бÑÐ´ÐµÑ Ð²ÑбÑоÑено иÑклÑÑение TypeError. Ð ES6 Ñакой аÑгÑÐ¼ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº пÑоÑÑой неÑаÑÑиÑÑемÑй обÑÐµÐºÑ Ð¸ меÑод его пÑоÑÑо веÑнÑÑ.
> Object.preventExtensions(1)
TypeError: 1 is not an object // код ES5
> Object.preventExtensions(1)
1 // код ES6
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.preventextensions> |