TypeError: can't define property "x": "obj" is not extensible
A exceção de modo strict do Javascript "can't define property "x": "obj" is not extensible" ocorre
quando Object.preventExtensions()
marcou um objeto como não extensível,
de modo que ele não terá propriedades além das que ele tinha no momento em que foi marcado
como não extensível.
Mensagem
TypeError: Cannot create property for a non-extensible object (Edge)
TypeError: can't define property "x": "obj" is not extensible (Firefox)
TypeError: Cannot define property: "x", object is not extensible. (Chrome)
Tipo de Erro
O que deu errado?
Geralmente, um objeto é extensível e novas propriedades podem ser adicionadas a ele. Contudo,
neste caso Object.preventExtensions()
marcou o objeto como não extensível,
de modo que ele não terá propriedades além das que ele tinha no momento em que foi marcado
como não extensível.
Exemplos
Adicionando uma nova propriedade para um objeto não extensível
No modo strict,
a tentativa de adicionar uma nova propriedade em um objeto não extensível
lança um TypeError
. No modo sloppy, a adição da propriedade "x" é
silenciosamente ignorada.
"use strict";
var obj = {};
Object.preventExtensions(obj);
obj.x = "foo";
// TypeError: can't define property "x": "obj" is not extensible
Em ambos os casos, modo strict e
modo sloppy, chamar Object.defineProperty()
lança uma exceção quando é adicionada uma nova propriedade em um objeto não extensível.
var obj = {};
Object.preventExtensions(obj);
Object.defineProperty(obj, "x", { value: "foo" });
// TypeError: can't define property "x": "obj" is not extensible
Para corrigir este erro, você precisa remover todas as chamadas para Object.preventExtensions()
,
ou movê-las para uma posição para que a propriedade seja adicionada antes e apenas depois o objeto seja marcado
como não extensível. Naturalmente, você pode remover a tentativa de adicionar a propriedade, se você não
precisar dela.
"use strict";
var obj = {};
obj.x = "foo"; // adiciona a propriedade antes e só então previne extensões
Object.preventExtensions(obj);