簡體   English   中英

使用ECMAScript 6箭頭函數作為類方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM