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

Gre*_*reg 5 javascript object parentheses

我很困惑为什么 javascript 以某种方式工作。如果我有一个对象设置为 obj 的变量。

如果我想列出对象中的所有键。
我会说

Object.keys(obj) 
Run Code Online (Sandbox Code Playgroud)

为什么不是

obj.keys()
Run Code Online (Sandbox Code Playgroud)

如果我使用的是 Array,它会是 arr.pop() 那么为什么 obj.keys() 的语法不一样呢??同样为什么它必须是 Object.keys(obj)

抱歉这个愚蠢的问题我只是想学习语言的特殊性

Cer*_*nce 10

可以把一个keys方法上Object.prototype,这样的事情作为工作你期待,但它不是一个好主意。

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

const obj = {
  prop: 'val'
};
const keys = obj.keys();
console.log(keys);
Run Code Online (Sandbox Code Playgroud)

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

const obj = {
  name: 'building 1',
  keys: 'foo'
}
Run Code Online (Sandbox Code Playgroud)

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

const obj = {
  name: 'building 1',
  keys: 'foo'
}
Run Code Online (Sandbox Code Playgroud)

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

另一方面,人们几乎普遍期望数组具有某些特定于数组的方法(如push),而没有其他方法。数组不是通用对象——您几乎总是希望数组只有数组方法,而数组几乎从不添加任意键。(如果您看到具有此功能的代码,那么它可能是值得重构的代码。)因此,对于数组,数组方法实际上不可能像泛型对象那样导致名称冲突。

因此,拥有 没有坏处Array.prototype.push,但Object.prototype.keys很容易引起问题。