javascript – 使用Object.assign和descriptors的原型链
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 使用Object.assign和descriptors的原型链,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1757字,纯文字阅读大概需要3分钟。
内容图文
![javascript – 使用Object.assign和descriptors的原型链](/upload/InfoBanner/zyjiaocheng/727/5dfc09661717497091abeff261e331c5.jpg)
让我们考虑一下这种情况:
var firstObject = {
set a(val) {
this._a_ = val;
},
get a() {
return this._a_;
}
}
var secondObject = Object.assign(firstObject);
secondObject.a = 3;
console.log(secondObject.a); // 3
console.log(firstObject.a); // 3
console.log(secondObject.hasOwnProperty('a')); // true
console.log(firstObject.hasOwnProperty('a')); // true
为什么firstObject和secondObject都返回3?
原型链如何在这里工作?
解决方法:
因为Object.assign的第一个参数是要分配的对象.然后Object.assign返回对该对象的引用.它从后续参数中分配,但您不提供任何参数.所以最终结果是firstObject和secondObject只指向同一个对象:
var firstObject = {
set a(val) {
this._a_ = val;
},
get a() {
return this._a_;
}
}
var secondObject = Object.assign(firstObject);
console.log("Same object? " + (firstObject === secondObject));
你自找的:
var secondObject = Object.assign({}, firstObject);
// Note -------------------------^^^^
另请注意,Object.assign将first的值从firstObject复制到该新对象,而不是它的属性描述符.所以secondObject上的a属性只是一个简单的属性,而不是一个访问器.
这是上面更改的片段,并在最后显示每个对象的描述符:
var firstObject = {
set a(val) {
this._a_ = val;
},
get a() {
return this._a_;
}
}
var secondObject = Object.assign({}, firstObject);
secondObject.a = 3;
console.log(secondObject.a); // 3
console.log(firstObject.a); // undefined
firstObject.a = 42;
console.log(firstObject.a); // 42
console.log(secondObject.a); // still 3
console.log(
"firstObject's a descriptor:",
Object.getOwnPropertyDescriptor(firstObject, "a")
);
console.log(
"secondObject's a descriptor:",
Object.getOwnPropertyDescriptor(secondObject, "a")
);
另请注意,作为Mister Epic pointed out,这里根本没有真正使用原型链. firstObject有自己的属性a,在复制之后,secondObject也是如此. secondObject不继承firstObject或类似的东西; Object.assign复制属性.
内容总结
以上是互联网集市为您收集整理的javascript – 使用Object.assign和descriptors的原型链全部内容,希望文章能够帮你解决javascript – 使用Object.assign和descriptors的原型链所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。