【问题标题】: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 方法放入我的对象原型中可能会导致什么问题?”...不是基于意见,但如果有人考虑这样做,仍然会有同样的问题,如果有人考虑这样做,回复会有所帮助这样的事情。

标签: javascript object key prototype javascript-objects


【解决方案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”,仅仅是因为更通用的名称?
    猜你喜欢
    • 2012-08-08
    • 2015-05-14
    • 2011-09-25
    • 1970-01-01
    • 2020-10-01
    • 2010-09-08
    • 2019-10-03
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多