Skip to main content

新增对象描述符方法

一、对象描述符有哪些

描述符说明
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