在类中使用Ecmascript 6箭头函数作为方法的正确方法是什么
What is the right way to use Ecmascript 6 arrow functions as methods in classes?
Ecmascript 6箭头函数似乎非常适合用作类中的方法,因为它们不受调用上下文干扰"this"引用的影响。不过,我不知道如何按照我期望的方式使用它们。下面是一个类,它显示了我可以看到的两种使用它们的方法:
class Person {
constructor(aName) {
this.name = aName;
this.say2 = () => console.log(this.name);
}
say() { console.log(this.name) }
say3() { () => consolve.log(this.name) }
}
say2和say3都将使用新的this处理,应该能够将它们传递给点击处理程序和其他需要回调的函数,而不必担心在某些情况下会调用回调,这会导致"this"意外地指向对象的适当实例之外的其他对象。
say2和say3看起来都很尴尬。say2是在构造函数中定义的,say3实际上是一个围绕箭头函数的包装器。我期待着一些sytax,这将允许我用类似的东西替换say()行
say: () => console.log(this.name)
但据我所知,你不能做这样的事。所以问题是,使用箭头函数作为方法是say2或say3的方法是合理的。有更好的方法吗?
在ES6语法中,类的主体可能只由方法定义组成,因此这里不允许使用箭头函数表达式。这是语法相关部分的简化片段:
ClassBody :
ClassElementList
ClassElementList :
ClassElement
ClassElementList ClassElement
ClassElement :
MethodDefinition
static MethodDefinition
;
MethodDefinition :
PropertyName ( StrictFormalParameters ) { FunctionBody }
GeneratorMethod
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList ) { FunctionBody }
所以在你的例子中:
class Person {
constructor(aName) {
this.name = aName;
this.say2 = () => console.log(this.name);
}
say() { console.log(this.name) }
say3() { () => console.log(this.name) }
}
say
是一个正常的方法定义,它与正常函数一样存在this
绑定的问题。但是,当您传递它时,您可以使用bind
来绕过它,就像在element.addEventListener('click', this.say.bind(this));
中一样say2
可以工作,但是您失去了在构造函数之外指定方法的便利性say3
不起作用——虽然它在语法上是有效的,但它将被解析为一个方法,其主体由一个箭头函数组成。为了澄清,say3() { () => console.log(this.name) }
和say3() { return () => console.log(this.name) }
的不同之处在于,前者将不执行任何操作并返回undefined
,而后者将返回一个箭头函数表达式,当调用该表达式时,该表达式将打印到控制台
相关文章:
- 打破承诺链的好方法是什么
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- knex:根据结果创建数组的合适方法是什么
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 使用Modernizr检测移动设备最可靠的方法是什么
- 确定var是否是javascript中的elementFinder对象的方法是什么
- 用javascript修复这个JSON对象字符串最干净的方法是什么
- 让会话值可用于JavaScript的好方法是什么
- 从AngularJs获取谷歌地图对象的正确方法是什么
- 使用ReactJS和Flux架构从服务器获取数据的正确方法是什么
- 列出没有 mysql 的元素的最佳方法是什么
- 克服错误的更优雅的方法是什么:需要对象说明符.当通过JXA通过Messages发送SMS时,参数没有对象说明符
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 在 Javascript 中实现解耦代码/回调的正确方法是什么?
- 使用Javascript,获取元素的方法是什么,基于打开和关闭标记之间的文本
- 在d3.json中使用d3.csv组合多个csv文件数据输入的最佳方法是什么
- 直接在DOM事件处理程序中调用作用域函数的最短方法是什么