返回

对象内部特性的分类与描述

前端

对象的创建方式

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的值。这是因为赋值运算符=会绕过对象的内部特性,直接修改对象的实际值。