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

时间:2015-07-06 17:57:23

标签: javascript node.js electron

我正在使用Electron创建一个小桌面应用并使用module.exports导出。在“服务器”端,这很好用。但是,当我在前端使用module.exports时,根据Electron docs,我得到了这个错误。

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);

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

如果你希望它的行为像一个类,并且能够在创建实例时从方法中获取其他属性,那么你应该这样做:

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);