我对 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/