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: estoque

Exemplo

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 }

Referências