在 ES7 中使用 Object.getOwnPropertyDescriptors
Object.getOwnPropertyDescriptors是ES7(2016)引入的一个新特性,它允许我们获取一个对象中所有自身属性的描述符。在传统的方式中,Object.getOwnPropertyNames只能获取对象中所有的key,而无法获取其他属性或描述符。这是一个极大的限制,因为TMD不能理解$meta等属性。所以,ES7就引入了此特性去解决这个问题。
其语法在MDN中的定义为:
Object.getOwnPropertyDescriptors(obj)
参数:
obj:需查找属性的对象。
返回值:
一个对象,其属性的键是被查询的对象的属性名称,属性值是该属性的描述符。
下面是一个简单的示例代码:(假设我们有一个对象 o)
const o = { name: 'Tom', age: 18, city: 'New York' } const descriptors = Object.getOwnPropertyDescriptors(o) console.log(descriptors)
输出结果如下:
-- -------------------- ---- ------- - ----- - ------ ------ --------- ----- ----------- ----- ------------- ---- -- ---- - ------ --- --------- ----- ----------- ----- ------------- ---- -- ----- - ------ ---- ------ --------- ----- ----------- ----- ------------- ---- - -
这里可以看到,我们得到了每个自身属性的描述符,其中value表示属性值,writable表示属性值是否可修改,enumerable表示属性是否可枚举,configurable表示属性是否可删除。
这意味着我们可以基于这个特性做一些非常有用的操作,例如:
- 创建具有相同属性和描述符的新对象
通过Object.defineProperties可以把描述符赋值给新对象,达到复制对象的效果。
-- -------------------- ---- ------- ----- - - - ----- ------ ---- --- ----- ---- ----- - ----- ----------- - ----------------------------------- ----- -- - --------------------------------------- ------------- ----------------
输出结果为:
{ name: 'Tom', age: 18, city: 'New York' }
- 避免属性拷贝的问题
在拷贝一个对象时使用Object.assign可能会遇到一个问题:只能拷贝非访问器属性的值,即不能拷贝访问器属性(getter/setter)。但是,使用Object.getOwnPropertyDescriptors,可以完全拷贝一个对象,包括访问器属性。
-- -------------------- ---- ------- ----- - - - --- ---- -- - ------ ----- - - ----- ----------- - ----------------------------------- ----- -- - --------------------------------------- ------------- ---------------------
输出结果为:
Tom
- 修改对象属性的描述符
当我们需要把某个对象属性变成只读,不可枚举或禁止删除时,快速修改属性描述符是非常方便的。
-- -------------------- ---- ------- ----- - - - ----- ------ - ----- ----------- - ----------------------------------- ------------------------ ------- - -------------------- --------- ----- --- ---------------------------------------------- ---------
输出结果为:
{ value: 'Tom', writable: false, enumerable: true, configurable: true }
总结:
使用Object.getOwnPropertyDescriptors可以让我们更轻松地操作对象属性描述符,它是ES7引入的一个非常实用的特性。我们可以通过它完成例如复制对象、拷贝访问器属性、修改对象属性描述符等操作。同时,也可以提高代码的可读性并减少运行时的错误。
参考资料:
Object.getOwnPropertyDescriptors MDN文档
ECMAScript 6 中的属性及属性描述符
ES6 系列之 Object.defineProperty()和 Object.getOwnPropertyDescriptors() 权限总览
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64787a8a968c7c53b04b70fa