【问题标题】:Why is Object.keys() method not added to Object.prototype?为什么 Object.keys() 方法没有添加到 Object.prototype 中?
【发布时间】:2019-11-22 20:34:21
【问题描述】:

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

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

Object.keys(obj) 

为什么会这样

obj.keys()

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

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

【问题讨论】:

标签: javascript object parentheses


【解决方案1】:

可以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 上的原型方法,以避免可能的名称冲突。

另一方面,几乎普遍期望数组具有某些特定于数组的方法(如push),而没有别的。数组不是通用对象——你几乎总是期望一个数组只有数组方法,而数组几乎永远不会添加任意键。 (如果您看到具有此功能的代码,则可能是值得重构的代码。)因此,对于数组,数组方法不会像泛型对象那样导致名称冲突。

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

【讨论】:

  • 这应该被标记为正确答案。
【解决方案2】:

除了假设的keys() 方法被遮蔽的可能性之外,还有可能该值根本不是Object 的实例。

考虑以下示例:

// properly define your suggested method
Object.defineProperty(Object.prototype, 'keys', {
  configurable: true,
  writable: true,
  value: function keys () { return Object.keys(this); }
})

const obj = { foo: 'bar', hello: 'world' };

console.log(obj instanceof Object);

// okay
console.log(obj.keys());

const value = Object.create(
  null,
  Object.getOwnPropertyDescriptors(obj)
);

console.log(value instanceof Object);

// existing approach still works
console.log(Object.keys(value));

// suggested approach fails
console.log(value.keys());

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多