NodeJs/Javascript 在嵌套中访问父方法 class

NodeJs/Javascript access parent method in nested class

class Foo extends EventEmitter {
    constructor(name) {
        this.name = name;
    }
    funcA(sourceRepositoryPath, branch) {

        this.emit('log', 'Hello from Foo');

        var bar = new Bar();
        bar.on('log', function(log) {
            this.emits('log', 'Hello from Foo from Bar');
        });
    }
}

我如何在 bar.on... 函数中使用 Foo 的 emit 函数,就像

this.emit('log', 'Hello from Foo');

ES6 中的函数?

var foo = new Foo();
foo.funcA();

foo.on('log', function(log) {
    // expects : Hello from Foo && Hello from Foo from Bar 
    // gets : Hello From Foo   
});

您在 bar.on() 处理程序中有不同的上下文,因此您需要将其绑定到外部范围:

bar.on('log', function(log) {
    this.emits('log', 'Hello from Foo from Bar');
}.bind(this));

或保留对它的引用:

var self = this;
bar.on('log', function(log) {
    self.emits('log', 'Hello from Foo from Bar');
});

或者当您使用 ES6/ES2015 时,您可以使用箭头函数来保持外部绑定(并且您的转译器将为您执行上述操作之一):

bar.on('log', (log) => {
    self.emits('log', 'Hello from Foo from Bar');
});

希望对您有所帮助!

箭头函数语法解决了这个问题:

class Foo extends EventEmitter {
    constructor(name) {
        this.name = name;
    }

    funcA(sourceRepositoryPath, branch) {
        this.emit('log', 'Hello from Foo');

        var bar = new Bar();
        bar.on('log', (log) => {
            this.emits('log', 'Hello from Foo from Bar');
        });
    }
}

除了更短、更简洁的语法外,箭头函数还定义了一个 "lexical this",这意味着箭头函数中的 this 关键字解析为定义该函数的实例。