为什么某些内置javascript方法是静态的而有些则不是呢?

时间:2019-05-10 03:24:18

标签: javascript

我已经看到数组的三种方法都是静态的,方法是静态的。 Array.isArray()Array.from()Array.of。我能理解为什么它们是静态方法。因为传递给他们的变量也可以是数组以外的东西。 NumberString也是如此。

但是我不明白为什么Object的几乎所有方法都是静态的。为什么keysentriesvalues等不在prototype上。

  • 将它们作为静态方法有什么优势?
  • 如果我们有Object.prototype.keys/entries/values...会遇到什么问题

1 个答案:

答案 0 :(得分:2)

对象方法存在于原型中的问题是对象通常可以具有任意键-值对。例如,如果存在诸如Object.prototype.values之类的东西,那么当您有一个打算具有values属性的对象时,很容易引起混乱,例如

const foo = { values: ['val1', 'val2'] };

如果Object.prototype.values是一件东西,要在这里使用它,您必须做类似的事情

const fooValues = Object.prototype.values.call(foo);

最好将values设为静态方法,以避免这种名称冲突。

如果对象的属性也可以是函数,则可能更糟,例如:

const foo = {
  info: ['a', 'b', 'c'],
  values() {
    return this.info;
  }
};

现在,如果Object.prototype.values是一个问题,并且您在代码中看到了foo.values(),您认为这意味着什么?程序员是否打算调用values的{​​{1}}属性(这就是代码的结果),还是程序员打算使用foo?这将是错误和难以阅读的代码的简单来源。

与其他Object静态方法相同-它们很容易导致名称冲突。