Resumo : neste tutorial, você aprenderá sobre as propriedades e atributos do objeto JavaScript, como configurável, enumerável, gravável, get, set e valor.
Tipos de propriedade de objeto
JavaScript especifica as características das propriedades dos objetos por meio de atributos internos cercados por dois pares de colchetes, por exemplo, [[Enumerable]]
.
Os objetos têm dois tipos de propriedades: propriedades de dados e propriedades de acesso.
1) Propriedades de dados
Uma propriedade de dados contém um único local para um valor de dados. Uma propriedade de dados possui quatro atributos:
-
[[Configurarable]]
– determina se uma propriedade pode ser redefinida ou removida viadelete
operador. -
[[Enumerable]]
– indica se uma propriedade pode ser retornada nofor...in
loop. -
[[Writable]]
– especifica que o valor de uma propriedade pode ser alterado. -
[[Value]]
– contém o valor real de uma propriedade.
Por padrão, os atributos [[Configurable]]
, [[Enumerable]]
And são definidos como para todas as propriedades definidas diretamente em um objeto. O valor padrão do atributo é .[[Writable]]
true
[[Value]]
undefined
Por exemplo, o seguinte cria um person
objeto com duas propriedades firstName
e lastName
com os atributos configuráveis, enumeráveis e graváveis definidos como true
e seus valores são definidos como 'John'
e 'Doe'
respectivamente:
let person = {
firstName: 'John',
lastName: 'Doe'
};
Linguagem de código: JavaScript ( javascript )
Para alterar qualquer atributo de uma propriedade, você usa o Object.defineProperty()
método.
O Object.defineProperty()
método aceita três argumentos:
- Um objeto.
- Um nome de propriedade do objeto.
- Um objeto descritor de propriedade que possui quatro propriedades:
configurable
,enumerable
,writable
evalue
.
Se você usar o Object.defineProperty()
método para definir uma propriedade do objeto, os valores padrão de [[Configurable]]
, [[Enumerable]]
e [[Writable]]
serão definidos como , false
a menos que especificado de outra forma.
O exemplo a seguir cria um person
objeto com a age
propriedade:
let person = {};
person.age = 25;
Linguagem de código: JavaScript ( javascript )
Como o valor padrão do [[Configurable]]
atributo é definido como true
, você pode removê-lo por meio do delete
operador:
delete person.age;
console.log(person.age);
Linguagem de código: CSS ( css )
Saída:
undefined
Linguagem de código: JavaScript ( javascript )
O exemplo a seguir cria um person
objeto e adiciona a ssn
propriedade a ele usando o Object.defineProperty()
método:
'use strict';
let person = {};
Object.defineProperty(person, 'ssn', {
configurable: false,
value: '012-38-9119'
});
delete person.ssn;
Linguagem de código: JavaScript ( javascript )
Saída:
TypeError: Cannot delete property 'ssn' of #<Object>
Linguagem de código: PHP ( php )
Neste exemplo, o configurable
atributo está definido como false
. Portanto, excluir a ssn
propriedade causa um erro.
Além disso, depois de definir uma propriedade como não configurável, você não poderá alterá-la para configurável.
Se você usar o Object.defineProperty()
método para alterar qualquer atributo diferente do gravável, receberá um erro. ou exemplo:
'use strict';
let person = {};
Object.defineProperty(person, 'ssn', {
configurable: false,
value: '012-38-9119'
});
Object.defineProperty(person, 'ssn', {
configurable: true
});
Linguagem de código: JavaScript ( javascript )
Saída:
TypeError: Cannot redefine property: ssn
Linguagem de código: JavaScript ( javascript )
Por padrão, o enumerable
atributo de todas as propriedades definidas em um objeto é true
. Isso significa que você pode iterar todas as propriedades do objeto usando o for...in
loop assim:
let person = {};
person.age = 25;
person.ssn = '012-38-9119';
for (let property in person) {
console.log(property);
}
Linguagem de código: JavaScript ( javascript )
Saída:
age
ssn
O seguinte torna a ssn
propriedade não enumerável, definindo o enumerable
atributo como false
.
let person = {};
person.age = 25;
person.ssn = '012-38-9119';
Object.defineProperty(person, 'ssn', {
enumerable: false
});
for (let prop in person) {
console.log(prop);
}
Linguagem de código: JavaScript ( javascript )
Saída
age
2) Propriedades do acessador
Semelhante às propriedades de dados, as propriedades do acessador também possuem atributos [[Configurable]]
e [[Enumerable]]
.
Mas as propriedades do acessador possuem os atributos [[Get]]
and [[Set]]
em vez de [[Value]]
and [[Writable]]
.
Quando você lê dados de uma propriedade do acessador, a [[Get]]
função é chamada automaticamente para retornar um valor. O valor de retorno padrão da [[Get]]
função é undefined
.
Se você atribuir um valor a uma propriedade do acessador, a [[Set]]
função será chamada automaticamente.
Para definir uma propriedade do acessador, você deve usar o Object.defineProperty()
método. Por exemplo:
let person = {
firstName: 'John',
lastName: 'Doe'
}
Object.defineProperty(person, 'fullName', {
get: function () {
return this.firstName + ' ' + this.lastName;
},
set: function (value) {
let parts = value.split(' ');
if (parts.length == 2) {
this.firstName = parts[0];
this.lastName = parts[1];
} else {
throw 'Invalid name format';
}
}
});
console.log(person.fullName);
Linguagem de código: JavaScript ( javascript )
Saída:
'John Doe'
Linguagem de código: JavaScript ( javascript )
Neste exemplo:
- Primeiro, defina o
person
objeto que contém duas propriedades:firstName
elastName
. - Em seguida, adicione a
fullName
propriedade aoperson
objeto como uma propriedade do acessador.
Na fullname
propriedade do acessador:
- O
[[Get]]
retorna o nome completo que é o resultado da concatenação defirstName
,space
, elastName
. - O
[[Set]]
método divide o argumento pelo espaço e atribui as propriedadesfirstName
elastName
das partes correspondentes do nome. - Se o nome completo não estiver no formato correto, ou seja, nome, espaço e sobrenome, ocorrerá um erro .
Defina múltiplas propriedades: Object.defineProperties()
No ES5, você pode definir múltiplas propriedades em uma única instrução usando o Object.defineProperties()
método. ou exemplo:
var product = {};
Object.defineProperties(product, {
name: {
value: 'Smartphone'
},
price: {
value: 799
},
tax: {
value: 0.1
},
netPrice: {
get: function () {
return this.price * (1 + this.tax);
}
}
});
console.log('The net price of a ' + product.name + ' is ' + product.netPrice.toFixed(2) + ' USD');
Linguagem de código: JavaScript ( javascript )
Saída:
The net price of a Smartphone is 878.90 USD
Linguagem de código: CSS ( css )
Neste exemplo, definimos três propriedades de dados: name
, price
, e tax
, e uma propriedade de acesso netPrice
para o product
objeto.
Descritor de propriedade de objeto JavaScript
O Object.getOwnPropertyDescriptor()
método permite obter o objeto descritor de uma propriedade. O Object.getOwnPropertyDescriptor()
método leva dois argumentos:
- Um objeto
- Uma propriedade do objeto
Ele retorna um objeto descritor que descreve uma propriedade. O objeto descritor possui quatro propriedades: configurável, enumerável, gravável e valor.
O exemplo a seguir obtém o objeto descritor da name
propriedade do product
objeto no exemplo anterior.
let person = {
firstName: 'John',
lastName: 'Doe'
};
let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log(descriptor);
Linguagem de código: JavaScript ( javascript )
Saída:
{ value: 'John',
writable: true,
enumerable: true,
configurable: true }
Linguagem de código: CSS ( css )
Resumo
- Os objetos JavaScript possuem dois tipos de propriedades: propriedades de dados e propriedades de acessador.
- JavaScript usa atributos internos denotados
[[...]]
para descrever as características de propriedades como[[Configurable]]
,[[Enumerable]]
,[[Writable]]
, e[[Value]]
,[[Get]]
, e[[Set]]
. - O método
Object.getOwnPropertyDescriptor()
retorna um descritor de propriedade de uma propriedade em um objeto. - Uma propriedade pode ser definida diretamente em um objeto ou indiretamente por meio dos métodos
Object.defineProperty()
ouObject.defineProperties()
. Esses métodos podem ser usados para alterar os atributos de uma propriedade.