为啥 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 错误“元素隐式具有‘任何’类型,因为索引表达式不是‘数字’类型”

Object.keys(),Object.values(),Object.entries()

Joi.object() 和 Joi.object().keys() 有啥区别?