Esta página foi traduzida do inglês pela comunidade.Saiba mais e junte-se à comunidade MDN Web Docs.
TypeError: "x" is read-only
Mensagem
TypeError: "x" is read-only (Firefox)TypeError: 0 is read-only (Firefox)TypeError: Cannot assign to read only property 'x' of #<Object> (Chrome)TypeError: Cannot assign to read only property '0' of [object Array] (Chrome)
In this article
Tipo de Erro
TypeErrorO que deu errado?
A variável global ou propriedade do objeto foi definida como propriedade somente-leitura. (Tecnicamente, esse é um dado denão-escrita.)
Esse erro ocorre apenas em código nostrict mode. No modo não strict mode, essa atribuição é ignorada silenciosamente.
Exemplos
>Casos inválidos
Propriedades somente-leitura não são super comuns, mas elas podem ser criadas utilizandoObject.defineProperty() ouObject.freeze().
"use strict";var obj = Object.freeze({ nome: "Elsa", pontuacao: 157 });obj.pontuacao = 0; // TypeError("use strict");Object.defineProperty(this, "CONTADOR_PULMAO", { value: 2, writable: false });CONTADOR_PULMAO = 3; // TypeError("use strict");var frozenArray = Object.freeze([0, 1, 2]);frozenArray[0]++; // TypeErrorExistem também algumas propriedades somente-leitura nativas do Javascript. Talvez você já tentou redefinir um constante matemática.
"use strict";Math.PI = 4; // TypeErrorDesculpe, você não pode fazer isso.
A variável globalundefined também é somente-leitura, então você não pode silenciar o infame erro "undefined is not a function" fazendo isso:
"use strict";undefined = function () {}; // TypeError: "undefined" is read-onlyCasos válidos
"use strict";var obj = Object.freeze({ nome: "Score", pontos: 157 });obj = { nome: obj.nome, pontos: 0 }; // substituindo com o novo objeto funciona("use strict");var CONTADOR_PULMAO = 2; // uma `var` funciona, porque ela não é somente-leituraCONTADOR_PULMAO = 3; // ok (anatomicamente improvável, porém...)Veja também
Object.defineProperty()Object.freeze()- "Quais animais tem três pulmões?" no answers.com
- Klingons (uma outra resposta para essa pergunta)