【问题标题】:Array.from instead of Array.prototype.from [duplicate]Array.from 而不是 Array.prototype.from [重复]
【发布时间】:2021-08-01 02:41:57
【问题描述】:

据我所知,任何与数组相关的方法都必须从其原型中访问,例如Array.prototype.slice.

为什么Array 对象上的from 方法像Array.from 那样被调用,而不是被称为Array.prototype.from

【问题讨论】:

  • 为什么要拥有一个数组实例以便创建一个新数组
  • slice 用于现有阵列,而from 创建一个新阵列。
  • Array.from('foo') 工作正常,而 'foo'.from() 会失败,因为 'foo' 不是 Array 的实例。

标签: javascript


【解决方案1】:

您可以将Array.from 视为数组的构造函数。这里重要的是它可以从类似数组的结构(具有类似数组的属性,如 indexes.length)和可迭代对象(具有 .next() 或换句话说- 有一个注册的迭代器)。

[1, 2, 3].from() 这样将.from() 方法附加到原型上绝对没有意义。您希望这种方法在这种情况下究竟能做什么?它没有任何作用。

一般来说,实例(原型)方法操作数组的特定已经存在的实例Array.from()Array.of()Array.isArray() 等静态的不需要(也不应该)需要实例。

这不仅适用于数组,也适用于一般类/原型设计,尤其是在数据结构中。

【讨论】:

    【解决方案2】:

    它不在Array.prototype 中,因为Array 实例不能从这种方法中受益(它不使用任何上下文)。至于为什么它在构造函数上,这纯粹是约定俗成的。您可以让函数在全局范围内浮动,例如ArrayFrom() 但规范将相关函数分组在各自的构造函数下,作为约定和命名空间以避免冲突。

    【讨论】:

      【解决方案3】:

      Array.from 是返回数组的静态方法,Array.prototype.slice 是来自 Array 原型的方法,可以在 Arrays 上调用。

      【讨论】:

        【解决方案4】:

        原因是JavaScript使用原型链:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

        一般来说,当在实例中找不到方法时,它会查找原型。如果该方法甚至不存在,它会在链中的以下原型中查找,依此类推。所以这就是为什么slice即使在原型中定义也能找到的原因。

        第二个原因是该类的所有实例都共享原型。所以所有的数组共享同一个原型——同一个对象。因此该方法不需要在每个实例中都重复,我们节省了一些空间。

        另一方面,from() 是类方法 - 您不需要实例来调用该方法。因此,它直接在 Array 类上定义,而不是在原型上(因为它是实例方法)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-05
          • 2013-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-25
          相关资源
          最近更新 更多