为啥 Object.keys 不是 Object.prototype.keys? [关闭]
Posted
技术标签:
【中文标题】为啥 Object.keys 不是 Object.prototype.keys? [关闭]【英文标题】:Why is Object.keys not Object.prototype.keys? [closed]为什么 Object.keys 不是 Object.prototype.keys? [关闭] 【发布时间】:2013-11-25 07:54:13 【问题描述】:我想知道为什么规范定义了Object.keys
而不是Object.prototype.keys
?如果 API 是一致的,那肯定会好很多,我想了解为什么不是这样。
其他方法在Object.prototype
,那为什么不是这样呢?
【问题讨论】:
请看我的更新。我并不是要主观,只是想了解为什么 API 的设计不一致。 这不一定是问题的问题,但可能是可能答案的问题。几乎所有人都会投机,因为做出决定的 ECMA 委员会的成员很少(如果有的话)。但是,简而言之,他们似乎觉得Object.prototype
不应该进一步增加。
“主要基于意见”只是一个最合适的回应;只有编写规范的人有足够的知识来谈论这个话题。其他一切都在猜测(意见)。
好的,我会在 ES6 邮件列表中询问...找到之后!
那么为什么不将其改写为“将 keys 方法放入我的对象原型中可能会导致什么问题?”...不是基于意见,但如果有人考虑这样做,仍然会有同样的问题,如果有人考虑这样做,回复会有所帮助这样的事情。
【参考方案1】:
我会假设他们这样做是因为并不总是很清楚什么是键,什么不是,例如:
var cls = function()
this.IAMAKEY = undefined;
this.someMethod = function() ;
;
Object.keys(new cls()); // ['IAMAKEY', 'someMethod']
顺便说一句,添加 Object.prototype.keys,返回 keys 方法:)
但如果你必须:
Object.defineProperty(Object.prototype, 'keys',
writable: false,
configurable: false,
value: function()
return Object.keys(this);
);
【讨论】:
【参考方案2】:因为您可以通过使用名为 keys
的键来定义对象来轻松覆盖它,该键包含值或函数。
var myObj =
val1: 'hi',
keys: function()
return true;
;
您希望myObj.keys()
返回什么?
【讨论】:
但是原型中的任何方法都是如此。为什么要挑出这个? @Mathletics 不是。 ES5 中添加的大多数新 Object 方法都是Object
构造函数的方法,而不是它的 prototype
。
这没有意义。一致性在哪里? :-S
@JonathanLonowski 当然,但这不会改变我的问题。为什么 any 这些方法不是原型的一部分?
@Mathletics 可能是因为方法“keys”更容易被意外覆盖,比如方法“hasOwnProperty”,仅仅是因为更通用的名称?以上是关于为啥 Object.keys 不是 Object.prototype.keys? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
折叠在 IE11 上不起作用(Object.keys:参数不是对象)
Object.keys(anObject) 是不是返回 anObject 的原型? [复制]
Object.keys映射返回对象Object而不是ReactJS中的文本输入表单中的值
Object.keys 迭代导致 Typescript 错误“元素隐式具有‘任何’类型,因为索引表达式不是‘数字’类型”