ES7 中的 new.target 和 Receiver 参数详解
ES7 中新增了两个关键字 new.target
和 Receiver
,在面向对象编程和函数式编程中都有重要作用。这篇文章将详细讲解这两个参数的作用和用法,以及它们对编程的指导意义。
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
时会报错。可以使用 call
或 apply
方法显示的传入调用对象,也可以使用 Receiver
参数将调用对象隐式传播进去,代码如下:
-- -------------------- ---- ------- -------- ----- - -------------------- - ----- ---- - - -- - -- ----- ---- - - -- -- --- -- ------------------ ----- ---- -- - ------------------ ----- ---- -- - ----------- -- ---------- ------ ---- -------- --- -- --------- -------- ------ - ---- - -------------- -- -
在以上示例中,使用 Reflect.apply
方法将 Receiver
参数传递给了函数 foo
,而在 bar
函数中,将 obj2.foo
作为参数传入,这样 Receiver
参数也被隐式传递进去。这种方式可以避免在多层函数调用时不断传递 this
引用,使代码更加简洁和易读。
综合应用
下面的示例代码展示了 new.target
和 Receiver
结合使用的场景:
-- -------------------- ---- ------- ----- ------ - ------------- - ------ - -- - ----- - ----- ----- - ----------- --------------- --------------- - - ----- ----- ------- ------ - ------------- - -------- ------ - -- - ----- - ----- - - -- -- -------------------- ----------------------------------- ----- ----- - - --- -------------- -- ---
在以上示例代码中,Child
类继承了 Parent
类,在 Child
类中重写了 bar
方法,在 bar
方法内部创建了一个标准箭头函数 r
,并且在调用 Parent
类的 foo
方法时,将 r
函数作为 Receiver
传递进去。在 Parent
类的 foo
方法内部,通过 new.target
获取当前调用的构造函数,创建一个新的实例,并调用实例的 bar
方法,最终输出了 1、2
。
可以看到,通过结合 new.target
和 Receiver
,我们可以方便地在多层继承和函数调用中传递调用对象,避免使用 this
关键字时出现的上下文混乱和不确定性。
总结
ES7 中新引入的关键字 new.target
和 Receiver
在面向对象编程和函数式编程中都有重要作用,能够帮助我们更好地处理函数调用和继承。new.target
可以在构造函数中更好地判断实例的来源,而 Receiver
可以帮助我们在多层函数调用和继承中更好地传递上下文调用对象。在实际开发中,我们可以结合两个关键字的使用,更好地进行代码设计和优化,提高代码的可维护性和可读性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648280e648841e98941e57b7