在方法中失去对对象的引用

Lose refernce to object within method

本文关键字:对象 引用 失去 方法      更新时间:2023-09-26

>我为我的问题创建了一个简单的例子

函数计数应计算我从查询中收到的项目数。但是,我目前实现它的方式在从路由调用时丢失了对我的函数的引用。 在这种情况下,函数doWork来自我无法修改的另一个节点模块。

无论如何都可以解决这个问题

function Counter(){
    this.array = createArray();
};

Counter.prototype.count = function (q){
query(q, function(data){
    if(data ===  "tabe")
    {
            this.array[0].total++;
    }
    else
    if(data === "chair")
    {
            this.array[1].total++;
    }
    else
    if(data === "lamp")
    {
            this.array[2].total++;
    }
    });
};
createArray = function (){
    var array = [];     
    array.push({item : "table",
                        total: 0});
    array.push({item : "chair",
                        total: 0});
    array.push({item : "lamp",
                        total: 0});    
    return array;
};
//The query function is actually in another node module that I cannot edit
query = function( data, callback){
    callback(data);
}    
module.exports = Counter;

索引.js文件

 /* Process query */    
router.get('/submit', function(req, res, next) {
    var counter = new Counter();
    counter.count("table");
    counter.count("table");
    counter.count("lamp");    

    for(var i = 0; i  < counter.array.length; i++){
        console.log(counter.array[i]);
    }
    res.end();
});

这是因为回调方法的执行上下文不引用Counter实例,因此可以使用 Function.bind() 将自定义上下文传递给回调方法。

Counter.prototype.count = function (q) {
    query(q, function (data) {
        if (data === "tabe") {
            this.array[0].total++;
        } else if (data === "chair") {
            this.array[1].total++;
        } else if (data === "lamp") {
            this.array[2].total++;
        }
    }.bind(this));
};

另一种选择是使用闭包变量

Counter.prototype.count = function (q) {
    var self = this;
    query(q, function (data) {
        if (data === "tabe") {
            self.array[0].total++;
        } else if (data === "chair") {
            self.array[1].total++;
        } else if (data === "lamp") {
            self.array[2].total++;
        }
    });
};