【问题标题】:Why some of the build-in javascript methods are static while some or not? [duplicate]为什么有些内置的 javascript 方法是静态的,而有些不是? [复制]
【发布时间】:2019-09-27 22:20:36
【问题描述】:

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

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

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

【问题讨论】:

  • Object.keys(x)x.keys 非常不同,x 本身可能会重新定义。

标签: javascript


【解决方案1】:

对象方法在原型上的问题是对象通常可以有任意键值对。例如,如果有 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(),您认为这意味着什么?程序员是打算调用foovalues 属性(这就是代码的结果),还是程序员打算使用Object.prototype.values?它很容易成为错误和难以阅读的代码的来源。

其他 Object 静态方法也是如此 - 它们很容易导致名称冲突。

【讨论】:

  • 哦,对不起......我应该仔细查看 foo 对象:p 你的例子是完美的:p - 基本上,你希望对象原型上的“本机”属性尽可能少,因为每个javascript中的单一事物是一个对象:p
猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2011-08-07
  • 1970-01-01
  • 2013-08-02
  • 2014-08-26
  • 2021-03-22
相关资源
最近更新 更多