javascript - ES2015 中的 [[class]] 属性

标签 javascript ecmascript-6

我正在开发一个简单的克隆功能

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/

相关文章:

javascript - React Js如何在点击导航按钮时将整个页面跳转到其他页面

javascript - setTimeout 在事件监听器中不起作用

javascript - Typescript 中是否可以嵌套枚举?

javascript - 如果数组最初不存在,如何在 React 中使用 .join()

javascript - JS - 检查对象内的数组是否为空

javascript - 为什么 fetch 会返回 "TypeError: Failed to fetch"而不仅仅是 "Failed to fetch"?

javascript - 以函数式编程风格存储值

Javascript:如何只检查复选框中的一项

javascript - 如何使用方法 get 修复表单操作

javascript - 如何从一堆计算值中逐个分配 Vue 对象的属性?