[英]What is the right way to use Ecmascript 6 arrow functions as methods in classes?
[英]Use ECMAScript 6 arrow functions as class methods
我正在用節點v8.9.4測試我的代碼
我想在我的Promise鏈中使用類方法。 但這失敗並出現錯誤: (node:68487) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'attr' of undefined
const fsp = require('fs-promise');
class MyClass {
constructor() {
this.attr = 'value';
}
promiseMe() {
console.log(this.attr);
}
main() {
fsp.readdir('.').then(this.promiseMe);
}
}
new MyClass().main();
因此,我嘗試將箭頭函數用作類方法。 但是將箭頭函數定義為類方法在語法上是不正確的: Unexpected token =
promiseMe = () => {
console.log(this.attr);
}
這可行,但確實很丑陋:
const fsp = require('fs-promise');
class MyClass {
constructor() {
this.attr = 'value';
this.promiseMe = () => {console.log(this.attr);}
}
main() {
this.promiseMe();
}
}
new MyClass().main();
那么如何在promise中使用類方法呢?
關於此主題還有另一個問題: 如何將箭頭函數(公共類字段)用作類方法? 不幸的是,這不適用於我的node.js設置。
正確,這是因為您在Promise中的上下文不正確。 一種方法是this
綁定到您的Promise上下文。 在您的示例中,您將其fsp.readdir('.').then(this.promiseMe.bind(this));
另外,如果您更頻繁地使用它,則可以將其綁定到構造函數中:
this.promiseMe = this.promiseMe.bind(this)
這會將它綁定到您的類中,這樣您就不再需要在每次調用時都進行綁定!
箭頭函數表達式的語法比函數表達式短,並且沒有自己的this,arguments,super或new.target。 這些函數表達式最適合於非方法函數,因此不能用作構造函數。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
您將收到TypeError: Cannot read property 'attr' of undefined
因為this
沒有引用您的類實例。
看來您已經弄清楚了有關class
語法的選擇。 但是我建議您自問class
語法/機制是否確實在提供您所需要的東西。
您很可能可以通過使用工廠功能來完成所需的一切。 這避免了使用this
所有丑陋怪癖:
const fsp = require('fs-promise');
function myClass() {
let attr = 'value';
const promiseMe = () => console.log(attr);
const main = () => fsp.readdir('.').then(promiseMe);
return { promiseMe, main };
}
myClass().main();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.