在 Node 的对象中使用 'this'?

Using 'this' in an object in Node?

我正在使用 Electron 创建一个小桌面应用程序并使用 module.exports 导出。在 'server' 方面,这工作正常。但是,根据 Electron 文档,当我在前端使用 module.exports 时,出现此错误。

Uncaught TypeError: this.showProgressbar is not a function"

var ViewController = {
    getPageCount: function (res) {
        this.total = res;
        this.showProgressbar(res);
    },

    showProgressBar: function (num) {
        $('.progress-container').addClass('show');
        $('.progress-bar').style('width', '0%');
    }
};

module.exports = ViewController;

在客户端,这就是我访问此文件的方式。

var view = require(__dirname + '/client/ViewController.js');

ipc.on('page_count', view.getPageCount);

在此实例中我应该如何访问内部方法?

那是因为当调用回调时,它是在错误的上下文中调用的。要绑定上下文,请使用 Function.bind.

ipc.on('page_count', view.getPageCount.bind(view));

ViewController 既不是 'Class' 也不是实例,它是一个具有两个属性的普通 javascript 对象。

如果您希望它表现得像 class 并且能够在创建实例时从方法访问其他属性,您应该这样做:

var ViewController = function(ipc){
        this.ipc=ipc;
        this.ipc.on('page_count', this.getPageCount);
};

ViewController.prototype.getPageCount: function (res) {
        this.total = res;
        this.showProgressbar(res);
},

ViewController.prototype.showProgressBar: function (num) {
    $('.progress-container').addClass('show');
    $('.progress-bar').style('width', '0%');
}
module.exports = ViewController;

你还需要实例化 ViewController :

var ViewController = require(__dirname + '/client/ViewController.js');

var controller = new ViewController(ipc);