新增对象描述符方法
一、对象描述符有哪些
描述符 | 说明 |
---|---|
value | 属性的值 |
writable | 属性的值是否可被改变 |
enumerable | 属性的值是否可被枚举 |
configurable | 描述符本身是否可被修改,属性是否可被删除 |
get | 获取该属性的访问器函数(getter)如果没有访问器,该值为 undefined |
set | 获取该属性的设置器函数(setter)如果没有设置器,该值为 undefined |
二、ES8 新增的对象描述符方法
1、getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor(obj, prop)
功能:获取目标对象上某自有属性的配置特性(属性描述符),返回值为配置对象。
参数:
- obj(必须):目标对象。
- prop(必须):目标自有属性。
返回值:如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。
示例:
var obj = {};
Object.defineProperty(obj, 'name', {
writable: true,
configurable: false,
enumerable: true,
value: 'Tim'
});
var prop = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(prop);
// {value: "Tim", writable: true, enumerable: true, configurable: false}
2、getOwnPropertyDescriptors
Object.getOwnPropertyDescriptors(obj)
功能:获取一个对象的所有自身属性。
参数:obj:目标对象。
返回值:所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
示例:
var obj = {};
Object.defineProperty(obj, 'name', {
writable: true,
configurable: false,
enumerable: true,
value: 'Tim'
});
var prop = Object.getOwnPropertyDescriptors(obj);
console.log(prop);
// {name: "Tim"}
三、对象描述符方法的应用
实现拷贝 getter 和 setter 属性:
使用 Object.assign 无法对 getter 和 setter 的内容进行拷贝,例如:
const p1 = {
firstName: 'Tim',
lastName: 'Cook',
get fullName() {
return this.firstName + ' ' + this.lastName
}
}
const p2 = Object.assign({}, p1)
p2.firstName = 'Tim'
console.log(p2)
// { firstName: 'Tim', lastName: 'Cook', fullName: 'Tim Cook' }
上面代码中,p2 中 get fullName 没有实现,因为 Object.assign 只是把 fullName 当成普通变量获取。
如果要获取全部的,需要这样做:
const descriptors = Object.getOwnPropertyDescriptors(p1)
console.log(descriptors)
/** 获取了全部的描述信息,然后再一个新对象上定义过去,这样才能全部拷贝过去
{
firstName: {
value: 'Tim',
writable: true,
enumerable: true,
configurable: true
},
lastName: {
value: 'Cook',
writable: true,
enumerable: true,
configurable: true
},
fullName: {
get: [Function: get fullName],
set: undefined,
enumerable: true,
configurable: true
}
}
*/
const p3 = Object.defineProperties({}, descriptors)
p3.firstName = 'Steve'
console.log(p3.fullName) // Steve Cook