We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Object.getOwnPropertyDescriptors(obj)的功能返回一个包含 obj 自身所有属性的属性描述符数组。
Object.getOwnPropertyDescriptors(obj)
const obj = { [Symbol('foo')]: 123, get bar() { return 'abc' }, }; console.log(Object.getOwnPropertyDescriptors(obj));
输出:
从 ES6 开始,才有了一个用来复制属性的工具方法:Object.assign()。但是,这个方法只能简单的使用 get 和 set 操作去复制那些本身就是关键字的属性。这也意味着它并不能正确地复制那些非默认属性。
Object.assign()
const source = { set foo(value) { console.log(value); } }; console.log(Object.getOwnPropertyDescriptor(source, 'foo'));
使用Object.assign()复制 foo 到 target 对象:
const target1 = {}; Object.assign(target1, source); console.log(Object.getOwnPropertyDescriptor(target1, 'foo'));
然后我们把Object.getOwnPropertyDescriptors()和Object.defineProperties()组合起来却能得到我们想要的结果。
Object.getOwnPropertyDescriptors()
Object.defineProperties()
const target2 = {}; Object.defineProperties(target2, Object.getOwnPropertyDescriptors(source)); console.log(Object.getOwnPropertyDescriptor(target2, 'foo'));
对象的浅复制也可以使用Object.getOwnPropertyDescriptors()。但是,这次我们用Object.create()来尝试一下,这个方法有两个参数:
Object.create()
const clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
使用对象字面量的最好方式就是创建一个对象,比如下面的示例中把内置属性__proto__指向了另一个任意的对象prot。
__proto__
prot
var prot = { value: 1 } const obj = { __proto__: prot, foo: 123, }; console.log(obj.value)
//正确的输出了我们所期望的值 1
可惜的是,这种用法只是在浏览器环境中才支持。更通用的做法是使用Object.create()和赋值操作。
var prot = { value: 1 } const obj = Object.create(prot); obj.foo = 123; console.log(obj.value)
//依然可以输出正确的值 1
还有一种实现方式就是使用Object.getOwnPropertyDescriptors()
var prot = { value: 1 } const obj = Object.create( prot, Object.getOwnPropertyDescriptors({ foo: 123, }) ); console.log(obj.value)
//输出了正确的结果 1
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Object.getOwnPropertyDescriptors(obj)
的功能返回一个包含 obj 自身所有属性的属性描述符数组。输出:
应用场景
复制若干属性给一个对象
从 ES6 开始,才有了一个用来复制属性的工具方法:
Object.assign()
。但是,这个方法只能简单的使用 get 和 set 操作去复制那些本身就是关键字的属性。这也意味着它并不能正确地复制那些非默认属性。使用
Object.assign()
复制 foo 到 target 对象:然后我们把
Object.getOwnPropertyDescriptors()
和Object.defineProperties()
组合起来却能得到我们想要的结果。对象复制
对象的浅复制也可以使用
Object.getOwnPropertyDescriptors()
。但是,这次我们用Object.create()
来尝试一下,这个方法有两个参数:Object.getOwnPropertyDescriptors()
方法返回的描述符属性集合使用对象字面量跨对象访问
使用对象字面量的最好方式就是创建一个对象,比如下面的示例中把内置属性
__proto__
指向了另一个任意的对象prot
。可惜的是,这种用法只是在浏览器环境中才支持。更通用的做法是使用
Object.create()
和赋值操作。还有一种实现方式就是使用
Object.getOwnPropertyDescriptors()
The text was updated successfully, but these errors were encountered: