访问回调中的对象属性

时间:2015-04-21 02:47:06

标签: javascript

我写了以下代码:

var Request = require('./request');

function Treasure(id) {
    Treasure.prototype.valid = false;
    Treasure.prototype.id = id;
    Treasure.prototype.contentLength = 0;
    Treasure.prototype.title = null;
    Treasure.prototype.seller = null;
    Treasure.prototype.buyer = null;
    Treasure.prototype.cost = 0;
}

Treasure.prototype.loadData = function() {
    EpvpRequest.treasureRequest(Treasure.prototype.id, function(data) {
        if (data.valid) {
            Treasure.prototype.valid = data.valid;
            Treasure.prototype.contentLength = data.contentLength;
            Treasure.prototype.title = data.title;
            Treasure.prototype.seller = data.seller;
            Treasure.prototype.buyer = data.buyer;
            Treasure.prototype.cost = data.cost;
        }
    });
}

module.exports = Treasure;

请不要打我,我刚开始学习javascript。 我想要访问" Treasure"的属性。但是我不能使用this,因为我在loadData函数中有一个回调,this会引用调用回调的函数 - 这是正确的吗?

但似乎我无法按照Treasure.prototype.property尝试的方式访问这些属性。

对此有什么正确的解决方法?

1 个答案:

答案 0 :(得分:4)

首先,您应该在构造函数中分配实例变量,而不是分配给原型。原型用于所有Treasure实例共享的方法和其他内容。

function Treasure(id) {
    this.valid = false;
    this.id = id;
    this.contentLength = 0;
    this.title = null;
    this.seller = null;
    this.buyer = null;
    this.cost = 0;
}

至于回调中this的问题,通常的解决方法是将this的值存储在常规变量中,然后在回调中使用该变量。

Treasure.prototype.loadData = function() {
    // Nothing special about "that"
    // Its just a regular variable.
    var that = this;
    EpvpRequest.treasureRequest(that.id, function(data) {
        if (data.valid) {
            that.valid = data.valid;
            that.contentLength = data.contentLength;
            that.title = data.title;
            that.seller = data.seller;
            that.buyer = data.buyer;
            that.cost = data.cost;
        }
    });
}

由于这种模式经常出现,有些人选择始终对“this-storage”变量使用相同的名称。一些较受欢迎的名称是selfthat