javascript - 为什么Object.keys()方法没有添加到Object.prototype中?

标签 javascript object parentheses

我对 JavaScript 为何以某种方式工作感到困惑。

如果我有一个对象设置为 obj 的变量,并且如果我想列出该对象中的所有键,我会说

Object.keys(obj)

为什么不是下面这样呢?

obj.keys()

如果我使用的是数组,那就是 arr.pop()。 那么为什么 obj.keys() 不使用相同的语法呢?再说一次,为什么它必须是Object.keys(obj)

最佳答案

可以在 Object.prototype 上放置一个 keys 方法,以便事情按照您的预期工作,但这并不是一个好方法想法。

Object.prototype.keys = function() {
  return Object.keys(this);
};

const obj = {
  prop: 'val'
};
const keys = obj.keys();
console.log(keys);

对于对象键,问题在于对象通常可以具有任何类型的键。该对象甚至可能有一个名为 keys 的键。因此,例如:

const obj = {
  name: 'building 1',
  keys: 'foo'
}

在这里,如果你执行了 obj.keys(),你会得到一个 TypeError,因为 keys 属性直接引用该属性对象上,而不是 Object.prototype 方法。

Object.prototype.keys = function() {
  return Object.keys(this);
};

const obj = {
  name: 'building 1',
  keys: 'foo'
};


const keys = obj.keys();
console.log(keys);

因此,用于获取对象所有键的方法被放在 Object 上,作为静态方法,而不是 Object.prototype 上的原型(prototype)方法,以避免可能的名称冲突。

另一方面,人们几乎普遍期望数组具有某些特定于数组的方法(例如push),并且没有其他。数组不是通用对象 - 您几乎总是期望数组仅具有数组方法,并且数组几乎永远不会添加任意键。 (如果您看到具有此内容的代码,那么它可能是值得重构的代码。)因此,对于数组,数组方法不可能像通用对象那样导致名称冲突。

因此,拥有 Array.prototype.push 没有什么坏处,但 Object.prototype.keys 很容易导致问题。

关于javascript - 为什么Object.keys()方法没有添加到Object.prototype中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57017736/

相关文章:

javascript - 如何以编程方式关闭 Material-Ui DropDownMenu

javascript - 如何从网络 worker 内部访问对象元素数据?

python - 括号配对 ({}[]()<>) 问题

emacs - 在 Emacs 中定义多字符括号

javascript - 递归地(或迭代地)用 d3.js 制作一个嵌套的 html 表?

javascript - ngSwipe 和水平滚动

javascript - Google map 仅在 iPad 上导致不可见的 html 元素,为什么会出现奇怪的行为?

Javascript 对象上下文更改和评估

javascript - 如何更改多个数组对象的索引?

arrays - VBA 带或不带括号的调用 Sub 或 Function 之间的根本区别是什么