将 Object.defineProperties 与符号一起使用是不是有效?

Posted

技术标签:

【中文标题】将 Object.defineProperties 与符号一起使用是不是有效?【英文标题】:Is it valid to use Object.defineProperties with symbols?将 Object.defineProperties 与符号一起使用是否有效? 【发布时间】:2016-07-06 19:31:16 【问题描述】:

让我们看下面的代码:

var obj = ;
var x = Symbol();
Object.defineProperties(obj, 
  [x]: 
    value: true,
    writable: true
  ,
  "property2": 
    value: "Hello",
    writable: false
  
  // etc. etc.
);
console.log(obj[x])

这有效吗?

使用原生 Object.defineproperties 代码,我们在 console.log 中得到 true。

使用 zone.js 的 polyfill

形式为:

  Object.defineProperties = function (obj, props) 
    Object.keys(props).forEach(function (prop) 
      Object.defineProperty(obj, prop, props[prop]);
    );
    return obj;
  ;

我们得到了同样的console.log代码未定义。

这是因为 Object.keys 函数。我用谷歌搜索了一下,没有找到任何地方是否应该允许这样做。

【问题讨论】:

语法上它是有效的,实际上它就像任何其他对象键被转换为字符串一样,如Symbol()(在这种情况下将是确切的键名)。如果您真的希望能够通过任意对象键入 - 使用 ES2015 Map() 呃,你不是在 此处的符号上定义属性吗? 【参考方案1】:

我用谷歌搜索了一下,没有找到任何地方是否应该允许这样做。

您可以随时查看规范,在本例中为 § 19.1.2.3 Object.defineProperties(O, Properties)。

它使用OwnPropertyKeys internal method,它确实列出了对象的所有字符串和符号键。

这是因为 Object.keys 函数

正确。它应该是Object.getOwnPropertyNames(props).concat(Object.getOwnPropertySymbols(props))。你可能想用 zone.js 提交一个错误。不过,我确实想知道为什么在使用 ES6 符号时需要为 ES5 Object.defineProperties 函数添加 polyfill?

【讨论】:

但是 polyfill 不应该应用在 Object.defineProperties 已经原生定义的 ES6 环境中?

以上是关于将 Object.defineProperties 与符号一起使用是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

Object.defineProperties()与Proxy对象代理

使用Object.Defineproperties改变对象数据结构

Object 的静态方法之 defineProperties 以及数据劫持效果

深入理解Object.defineProperty

Object备忘录

Object 的一些方法