普通对象 Object
用于表示复杂的数据结构,普通对象由多个键值对组成,其中每个键值对表示一个属性名和其对应的属性值。
属性名必须是 Number | String | Symbol 类型。如果存储的属性名不是该类型,会调用 toString()
将其转换后保存。
属性值可以是任何有效 JavaScript 值。
普通对象的属性和方法
当我们声明一个普通对象,普通对象会自动继承 Object.prototype 上的属性和方法。
const obj = {
a: 1
};
console.dir(obj);
ECMAScript的内置普通对象
对象名称 | 类型 |
---|---|
Atomics | The object |
JSON | The object |
Math | The object |
Reflect | The 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'