Object.preventExtensions()

O método Object.preventExtensions() impede que novas propriedades sejam adicionadas a um objeto (isto é, impede futuras extensões ao objeto).

Syntax

Object.preventExtensions(obj)

Parâmetros

obj
O objeto a tornar-se não-extensível.

Valor de retorno

Um objeto tornado não-extensível.

Descrição

Um objeto é extensível se novas propriedades puderem der adicionadas ao mesmo. Object.preventExtensions() marca um objeto como não mais extensível, de forma que este nunca terá novas propriedades além daquelas que o objeto tinha quando foi marcado como não-extensível. Note que as propriedades de um objeto não-extensível, em geral, ainda poderão ser apagadas. Tentativas de adicionar novas propriedades a um objeto não-extensível falharão, tanto silenciosamente ou lançando uma exceção TypeError (mais comumente, mas não exclusivamente, quando em strict mode).

Object.preventExtensions() evita apenas a adição de novas propriedades diretas. Proprieades ainda poderão ser adicionadas ao protótipo do objeto.

É impossível tornar um objeto extensível novamente uma vez que o mesmo tenha se tornado não-extensível.

Exemplos

// Object.preventExtensions retorna o objeto
// tornado não-extensível.
var obj = {};
var obj2 = Object.preventExtensions(obj);
obj === obj2; // verdadeiro

// Objetos são extensíveis por padrão...
var empty = {};
Object.isExtensible(empty); // === verdadeiro

// ...mas isso pode ser mudado.
Object.preventExtensions(empty);
Object.isExtensible(empty); // === falso

// Object.defineProperty lança erro quando adiciona-se
// uma nova propriedade a um objeto não-extensível.
var nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, 'new', {
  value: 8675309
}); // lança um TypeError

// No modo restrito, tentar adicionar novas propriedades a
// um objeto não-extensível lança um TypeError.
function fail() {
  'use strict';
  // lança um TypeError
  nonExtensible.newProperty = 'FAIL';
}
fail();

O protótipo não-extensível de um objeto é imutável:

var fixed = Object.preventExtensions({}); 
// lança um 'TypeError'.
fixed.__proto__ = { oh: 'hai' };

Notas

No ES5, se o argumento atribuído a este método não for um objeto (for um primitivo), isso causará um erro de tipo TypeError. No ES2015, um argumento não-objeto será tratado como se o mesmo fosse um objeto não-extensível comum, simplesmente retornando-o.

Object.preventExtensions(1);
// TypeError: 1 não é um objeto (código ES5)

Object.preventExtensions(1);
// 1                             (código ES2015)

Especificações

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.preventExtensions' in that specification.
Padrão Definição inicial. Implementado em JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.preventExtensions' in that specification.
Padrão  
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.preventExtensions' in that specification.
Rascunho  

Compatibilidade com navegadores

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
preventExtensionsChrome Full support 6Edge Full support 12Firefox Full support 4IE Full support 9Opera Full support 12Safari Full support 5.1WebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
ES2015 behavior for non-object argumentChrome Full support 44Edge ? Firefox Full support 35IE Full support 11Opera Full support 31Safari Full support 9WebView Android Full support YesChrome Android Full support YesFirefox Android Full support 35Opera Android Full support YesSafari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support
Compatibility unknown  
Compatibility unknown

Veja também