为什么Object.keys不是Object.prototype.keys?

22

我想知道为什么规范定义了Object.keys而不是Object.prototype.keys?如果API保持一致,那肯定会更好,我想了解为什么情况不是如此。

其他方法都在Object.prototype中,为什么这个方法不在其中呢?


请看我的更新。我并不想主观地看待问题,只是想了解为什么API没有被设计成一致的。 - user1082754
这并不一定是问题出在问题本身,而很可能是潜在答案的问题。几乎所有的答案都是推测性的,因为很少有人会来自做出决定的 ECMA 委员会成员。但总的来说,他们似乎认为 Object.prototype 不应再被扩展。 - Jonathan Lonowski
2
“Primarily opinion based”只是最合适的回答;只有编写规范的人才有足够的知识来谈论这个话题。其他所有的都是猜测(意见)。 - Evan Davis
1
好的,我会在找到它之后在ES6邮件列表上询问。 - user1082754
为什么不将其重新表述为“What problems might putting the keys method in my object prototype cause?”...这不是基于观点的问题,但仍然是同样的问题,如果有人考虑这样做,回答会有所帮助。 - homtg
显示剩余4条评论
2个回答

4

因为您可以通过定义一个名为keys的键来轻松地覆盖它,该键包含一个值或函数。

var myObj = {
  val1: 'hi',
  keys: function() {
    return true;
  }
};

你期望myObj.keys()返回什么?

7
但这适用于原型中的任何方法。为什么要单独挑出这个? - Evan Davis
2
@Mathletics 不是这样的。ES5 中添加的大多数新对象方法都是 Object 构造函数的方法,而不是它的原型方法。 - Jonathan Lonowski
2
这没有意义。一致性在哪里?:-S - user1082754
@JonathanLonowski 当然可以,但这并不改变我的问题。为什么任何一个方法都不是原型的一部分呢? - Evan Davis
6
也许之所以使用“keys”方法容易被意外覆盖,是因为它的名字比如“hasOwnProperty”这样更通用的方法名称更容易发生这种情况? - basilikum

4

我认为他们这样做是因为有时候很难明确哪些是键,哪些不是,例如:

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);
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接