ECMAScript 2020(ES11)的新特性:双冒号运算符

阅读时长 4 分钟读完

在 ECMAScript 2020(也就是 ES11)中,新引入了一个双冒号运算符(::),它是一个更便捷的写法来调用函数或方法中的 this 值。

双冒号运算符的使用

双冒号运算符可以接收一个对象和一个函数名作为参数,然后返回这个函数的绑定值。在使用双冒号运算符时,前面的对象就可以被用作函数的上下文,也就是 this 的指向。

下面是一个简单的例子,使用双冒号运算符来调用一个绑定到对象上的方法:

-- -------------------- ---- -------
----- -------- - -
  ------ ---
  ---------- -
    ------ -----------
  -
--

----- -------- - ------------------

------------------------ -- ---------

----- ------------- - -------------------

----------------------------- -- --

在这个例子中,我们创建了一个包含了 getValue 方法的对象(myObject)。在调用这个方法时,我们将 this 的指向设定为 myObject。然后我们将 getValue 方法赋值给了另一个变量(getValue),这个变量的调用结果就是 undefined,因为 this 指向不明。

接着,我们将 myObject 和 getValue 传递给了 :: 运算符,以创建一个绑定了上下文的函数。我们赋值给了一个新的变量(boundGetValue),然后调用这个变量的结果就是我们期望的 42。

双冒号运算符的指导意义

那么,为什么你会用到双冒号运算符呢?这其实主要要看你的代码库中是否有大量的与 this 有关的方法。如果你使用了大量的回调函数或事件处理函数,那么使用双冒号运算符可以让你更便捷地为这些函数指定 this 的指向。它让我们避免了使用 bind 或括号运算符的情况,同时也比箭头函数更传统化。

示例代码

在下面的示例代码中,我们使用了双冒号运算符来简化一个事件处理程序,这个处理程序自动响应一个文本输入框中的用户输入。

-- -------------------- ---- -------
----- ------- -
  ------------- -
    ----------------- - ---
    ---------------- - ----------------------------
  -

  ------------------ -
    ----------------- - -------------------
  -

  ------ -
    ----- ------------ - --------------------------------

    ----------------- - -------

    --------------------------------------- ------------------

    ------ -------------
  -
-

----------------------------- ------------------

在这个例子中,我们创建了一个新的 MyClass 类,该类有一个 handleInput() 方法,该方法会将当前值设定为输入框中的文本值。我们在构造函数中将 handleInput() 方法绑定到了 this 上。

在 init() 方法中,我们创建了一个新的输入框(inputElement),然后将 handleInput() 方法传递给了 ::addEventListener() 函数,以便当用户输入时能够自动更新当前值。 这将允许输入时,以事件处理程序的方式更新 MyClass 实例中的值,而无需使用括号运算符或 bind() 函数来设置上下文。

结论

双冒号运算符 :: 是 ECMAScript 2020 中引入了的一个有用的新特性,它为回调函数和事件处理函数中的 this 指向问题提供了一种新的解决方案。如果你有大量具有 this 上下文的方法,那么在需要用到的时候不妨尝试一下使用双冒号运算符吧!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/677296106d66e0f9aadb1aa6

纠错
反馈