我正在开发一个简单的克隆功能
var shallowCopy = function (value) {
// in ES2017 we can use
// return Object.create(Object.getPrototypeOf(value), Object.getOwnPropertyDescriptors(value));
let propDescriptors = {};
for (let i of Object.getOwnPropertyNames(value)) {
propDescriptors[i] = Object.getOwnPropertyDescriptor(value, i);
}
return Object.create(Object.getPrototypeOf(value), propDescriptors);
};
我理解这种行为 Object.prototype.toString.call(shallowCopy([]))
是 [object Object]
,而不是 [object Array]
.
但是 ES6 中的一些新类型看起来不错
Object.prototype.toString.call(shallowCopy(new Set())) // [object Set]
Object.prototype.toString.call(shallowCopy(new Map())) // [object Map]
有人可以告诉我为什么这些对象的行为不同吗?
这种行为将来会改变吗?
谢谢。
最佳答案
该对象不是一个集合。实数集具有无法复制的内部 [[SetData]] 槽。
shallowCopy(new Set()).add(123); // TypeError: add method called on incompatible Object
基本上,不要相信 [[Class]] 知道你拥有哪种对象。好吧,事实上 [[Class]] 在 ES6 中已经被摧毁并且不再存在。
关于javascript - ES2015 中的 [[class]] 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38160195/