我写了以下代码:
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
尝试的方式访问这些属性。
对此有什么正确的解决方法?
答案 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”变量使用相同的名称。一些较受欢迎的名称是self
和that
。