一个 JavaScript 对象里面可能有一堆属性,属性都有一个名字,还有对应的值,除了这些其实还隐含了一些东西,这就是 Property Descriptor。来做个实验:
const user = { name: 'ninghao', }; const descriptor = Object.getOwnPropertyDescriptor(user, 'name'); console.log(descriptor);
上面定义了一个叫 user 的对象,里面只有一个属性叫 name,对应的值是个字符串 ninghao。如果要检查一下 name 这个属性的 Descriptor,可以使用 Object 上的 getOwnProperyDescriptor 方法,把对象还有对象的属性交给这个方法就可以了。
执行上面的代码,会返回:
{ value: 'ninghao', writable: true, enumerable: true, configurable: true }
上面返回的结果就是 user 对象里的 name 这个属性的 Descriptor,value 是属性的值,writable 表示是否可写,enumerable 表示是否可枚举,configurable 表示是否可配置。
再做个实验:
Object.defineProperty(user, 'name', { writable: false }); user.name = 'wanghao';
上面用 Object 上的 defineProperty 设置了一下 user 对象的 name 属性的 Descriptor,把它的 writable 设置成了 false。接着我们试着设置一下 user 的 name 属性的值,执行代码会返回:
TypeError: Cannot assign to read only property 'name' of object ...
提示不能给只读属性分配新的值,这是因为我们之前把 name 这个属性的 writable 设置成了 false。