将 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改变对象数据结构