ES7 中的 new.target 和 Receiver 参数详解

阅读时长 5 分钟读完

ES7 中的 new.target 和 Receiver 参数详解

ES7 中新增了两个关键字 new.targetReceiver,在面向对象编程和函数式编程中都有重要作用。这篇文章将详细讲解这两个参数的作用和用法,以及它们对编程的指导意义。

new.target

ES7 中,new.target 关键字用于在构造函数中获取当前调用的构造函数。在使用 new 关键字创建实例时,new.target 表示构造函数本身,而在通过 super 调用父类的构造函数时,new.target 表示派生类的构造函数。如果只是普通函数调用,new.target 将是 undefined

示例代码:

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

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

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

在以上示例中,使用 new.target 可以在构造函数中判断实例是由哪个构造函数调用的。同时,注意到即使子类的构造函数调用了父类的构造函数,new.target 仍然表示的是子类的构造函数,这样让我们更加清晰地知道实例的来源。

Receiver

Receiver 是在函数式编程中一个重要的参数。它表示函数的上下文调用对象。类似于 this 关键字,Receiver 也代表当前函数调用的对象,但不同的是 Receiver 可以通过显示的方式传递进函数。

示例代码:

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

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

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

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

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

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

在以上示例中,foo 函数使用了 this 关键字,但如果不传入对象调用,使用 this 时会报错。可以使用 callapply 方法显示的传入调用对象,也可以使用 Receiver 参数将调用对象隐式传播进去,代码如下:

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

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

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

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

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

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

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

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

在以上示例中,使用 Reflect.apply 方法将 Receiver 参数传递给了函数 foo,而在 bar 函数中,将 obj2.foo 作为参数传入,这样 Receiver 参数也被隐式传递进去。这种方式可以避免在多层函数调用时不断传递 this 引用,使代码更加简洁和易读。

综合应用

下面的示例代码展示了 new.targetReceiver 结合使用的场景:

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

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

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

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

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

在以上示例代码中,Child 类继承了 Parent 类,在 Child 类中重写了 bar 方法,在 bar 方法内部创建了一个标准箭头函数 r,并且在调用 Parent 类的 foo 方法时,将 r 函数作为 Receiver 传递进去。在 Parent 类的 foo 方法内部,通过 new.target 获取当前调用的构造函数,创建一个新的实例,并调用实例的 bar 方法,最终输出了 1、2

可以看到,通过结合 new.targetReceiver,我们可以方便地在多层继承和函数调用中传递调用对象,避免使用 this 关键字时出现的上下文混乱和不确定性。

总结

ES7 中新引入的关键字 new.targetReceiver 在面向对象编程和函数式编程中都有重要作用,能够帮助我们更好地处理函数调用和继承。new.target 可以在构造函数中更好地判断实例的来源,而 Receiver 可以帮助我们在多层函数调用和继承中更好地传递上下文调用对象。在实际开发中,我们可以结合两个关键字的使用,更好地进行代码设计和优化,提高代码的可维护性和可读性。

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

纠错
反馈