返回
对象内部特性的分类与描述
前端
2023-10-05 02:50:15
对象的创建方式
1. 对象字面量
const person = {
name: 'John Doe',
age: 30,
city: 'New York'
};
2. new Object()
const person = new Object();
person.name = 'John Doe';
person.age = 30;
person.city = 'New York';
3. Object.create()
const person = Object.create(null);
person.name = 'John Doe';
person.age = 30;
person.city = 'New York';
对象的内部特性
每个对象都有一些内部特性来自己属性的特征,分别是数据属性和访问器属性。
1. 数据属性
数据属性是具有值的属性。数据属性的特征有:
- 值: 数据属性的值可以是任何类型,包括基本类型(如字符串、数字、布尔值)和引用类型(如数组、对象、函数)。
- 可写性: 数据属性可以是可写的或不可写的。可写的属性的值可以被修改,而不可写的属性的值不能被修改。
- 可枚举性: 数据属性可以是可枚举的或不可枚举的。可枚举的属性会在使用
for...in
循环遍历对象时被枚举出来,而不可枚举的属性不会被枚举出来。 - 可配置性: 数据属性可以是可配置的或不可配置的。可配置的属性可以被删除或修改其特性,而不可配置的属性不能被删除或修改其特性。
2. 访问器属性
访问器属性是通过getter和setter方法访问的属性。访问器属性的特征有:
- getter方法: getter方法用于获取属性的值。getter方法必须是一个函数,并且不能有参数。
- setter方法: setter方法用于设置属性的值。setter方法必须是一个函数,并且必须有一个参数。
- 可写性: 访问器属性可以是可写的或不可写的。可写的属性的值可以通过setter方法修改,而不可写的属性的值不能被修改。
- 可枚举性: 访问器属性可以是可枚举的或不可枚举的。可枚举的属性会在使用
for...in
循环遍历对象时被枚举出来,而不可枚举的属性不会被枚举出来。 - 可配置性: 访问器属性可以是可配置的或不可配置的。可配置的属性可以被删除或修改其特性,而不可配置的属性不能被删除或修改其特性。
获取对象的内部特性
我们可以使用Object.getOwnPropertyDescriptor(对象,对象的指定属性)
方法获取对象的内部特性。Object.getOwnPropertyDescriptor()
方法返回一个对象,该对象包含了指定属性的内部特性。
const person = {
name: 'John Doe',
age: 30,
city: 'New York'
};
const descriptor = Object.getOwnPropertyDescriptor(person, 'name');
console.log(descriptor);
输出:
{
value: 'John Doe',
writable: true,
enumerable: true,
configurable: true
}
修改对象的内部特性
我们可以使用Object.defineProperty()
方法修改对象的内部特性。Object.defineProperty()
方法有三个参数:
- 对象: 要修改的属性所在的对象。
- 属性名称: 要修改的属性的名称。
- 符: 要修改的属性的内部特性的描述符对象。
const person = {
name: 'John Doe',
age: 30,
city: 'New York'
};
Object.defineProperty(person, 'name', {
writable: false
});
person.name = 'Jane Doe';
console.log(person.name); // 输出:John Doe
从上面的例子中,我们可以看到,尽管我们已经将name
属性设置为不可写的,但person.name
的值并没有改变。这是因为Object.defineProperty()
方法只能修改对象的内部特性,而不能修改对象的实际值。如果我们要修改对象的实际值,我们需要使用赋值运算符=
。
const person = {
name: 'John Doe',
age: 30,
city: 'New York'
};
Object.defineProperty(person, 'name', {
writable: false
});
person.name = 'Jane Doe';
console.log(person.name); // 输出:Jane Doe
从上面的例子中,我们可以看到,尽管我们已经将name
属性设置为不可写的,但我们仍然可以通过赋值运算符=
修改person.name
的值。这是因为赋值运算符=
会绕过对象的内部特性,直接修改对象的实际值。