Skip to main content

普通对象 Object

用于表示复杂的数据结构,普通对象由多个键值对组成,其中每个键值对表示一个属性名和其对应的属性值

属性名必须是 Number | String | Symbol 类型。如果存储的属性名不是该类型,会调用 toString() 将其转换后保存。

属性值可以是任何有效 JavaScript 值。

普通对象的属性和方法

当我们声明一个普通对象,普通对象会自动继承 Object.prototype 上的属性和方法。

const obj = {
a: 1
};
console.dir(obj);

普通对象


普通对象原型链

ECMAScript的内置普通对象

对象名称类型
AtomicsThe object
JSONThe object
MathThe object
ReflectThe object

DefineProperty的特性属性

使用 Object.defineProperty(obj, propertyKey, descriptor) 方法时,可以通过 descriptor 对象来定义属性的特性。

属性名类型默认值描述
Value数据属性undefined通过属性的 Get 访问权限检索到的值
Writable数据属性false如果是 false,则 ECMAScript 代码尝试使用 Set 更改属性的 Value 不会成功
Get访问器属性undefined如果属性的值是一个对象,它必须是一个函数对象。每次对该属性进行获取访问时,函数的内部 Call 方法会以空参数列表调用,以检索属性的值
Set访问器属性undefined如果属性的值是一个对象,那么它必须是一个函数对象。每次对该属性进行设置访问时,函数的内部 Call 方法会被调用,并以包含被赋值的值作为唯一参数的参数列表调用
Enumerable数据属性 或 访问器属性false如果是 true,则该属性将在 for-in 枚举中被枚举。否则,该属性被称为不可枚举
Configurable数据属性 或 访问器属性false如果是 false,对其属性进行任何更改(除了替换现有的 Value 或将 Writable 设置为false)都将失败

将数据属性 Writable 设置为 false

const person = {
name: 'Alice',
};

// 设置name属性的可写特性为false
Object.defineProperty(person, 'name', {
writable: false,
});

person.name = 'Bob'; // 此赋值操作将不会生效

console.log(person.name); // 'Alice'

将访问器属性 Get 重写

function User(fullName) {
this.fullName = fullName.split(' ');

Object.defineProperty(this, 'firstName', {
get: function() {
return this.fullName[0];
}
});

Object.defineProperty(this, 'lastName', {
get: function() {
return this.fullName[1];
}
});
}

var jone= new User("Jone Coven");

console.log(jone.fullName); // 输出:['Jone', 'Coven']
console.log(jone.firstName); // 输出:'Jone'
console.log(jone.lastName); // 输出:'Coven'