Método Object.defineProperty()
Prevenir alterações de valores em apenas alguma propriedade de um objeto.
Nota
Esse método define apenas para 1 propriedade.
Sintaxe
Object.defineProperty(
[objeto],
[nome da propriedade],
[objeto de configuração]
)Opções de configuração do objeto
Opção enumerable (boolean):
indicar se esta propriedade será exibido na enumeração das propriedades de um objeto (ao utilizar console.log() ou Object.keys(), por exemplo).
enumerable: true
function Produto(nome, preco, estoque) {
this.nome = nome;
this.preco = preco;
this.estoque = estoque;
Object.defineProperty(this, "estoque", {
enumerable: true,
value: estoque
})
}
const produto = new Produto("Camiseta", 20, 3);
console.log(produto); // Produto { nome: 'Camiseta', preco: 20, estoque: 3 }enumerable: false (Valor padrão)
function Produto(nome, preco, estoque) {
this.nome = nome;
this.preco = preco;
this.estoque = estoque;
Object.defineProperty(this, "estoque", {
enumerable: false,
value: estoque
})
}
const produto = new Produto("Camiseta", 20, 3);
console.log(produto); // Produto { nome: 'Camiseta', preco: 20 }value (any):
Indicar o valor da propriedade. O valor padrão é undefined.
function Produto(nome, preco, estoque) {
this.nome = nome;
this.preco = preco;
this.estoque = estoque;
Object.defineProperty(this, "estoque", {
enumerable: true,
value: estoque,
})
}
const produto = new Produto("Camiseta", 20, 3);
console.log(produto); // Produto { nome: 'Camiseta', preco: 20 }writable (boolean):
Indicar se esta propriedade será imutável (writable: false) ou mutável (writable: true). O valor padrão é false.
function Produto(nome, preco, estoque) {
this.nome = nome;
this.preco = preco;
this.estoque = estoque;
Object.defineProperty(this, "estoque", {
enumerable: true,
value: estoque,
writable: false
})
}
const produto = new Produto("Camiseta", 20, 3);
produto.estoque = 100;
console.log(produto); // Produto { nome: 'Camiseta', preco: 20 }configurable (boolean):
Indicar se esta propriedade é configurável (permitir deletar ou reconfigurar a propriedade). O valor padrão é false.
function Produto(nome, preco, estoque) {
this.nome = nome;
this.preco = preco;
this.estoque = estoque;
Object.defineProperty(this, "estoque", {
enumerable: true,
value: estoque,
writable: false,
configurable: false // <--
});
// Erro
Object.defineProperty(this, "estoque", {
enumerable: true,
value: estoque,
writable: false,
configurable: false
});
}
const produto = new Produto("Camiseta", 20, 3);
console.log(produto); // Cannot redefine property: estoqueExemplo
function Produto(nome, preco, estoque) {
this.nome = nome;
this.preco = preco;
this.estoque = estoque;
Object.defineProperty(this, "estoque", {
enumerable: true,
value: estoque,
writable: false,
configurable: false
});
}
const produto = new Produto("Camiseta", 20, 3);
console.log(produto); // Produto { nome: 'Camiseta', preco: 20, estoque: 3 }