我的Javascript中的一个类有时需要与Json“更新”。我总是做一个函数,在给定id的情况下更新数据数组,但现在我想更多地封装(函数更新,在类中)。
我做了什么:
function File(data){
this.data = data;
this.update = function (callback){
var set = function(ajaxData){
this.data = ajaxData.PcbFile;
}
getPcbFile(data.id, function(ajaxData){
set(ajaxData);
callback();
});
};
}
但是,this.data = ajaxData.PcbFile;
不起作用......我的对象仍然是最后一个数据集,而不是更新的数据集。函数SET,我创建的另一种尝试来设置数据。
ajax没有问题,因为我对ajaxData进行了调试,并且没问题(当我更新时)。
那么,我如何真正从内部函数访问对象属性data
?
(对不起我的英文......)
答案 0 :(得分:16)
我很难学到这一点,你必须小心this
。它总是指当前范围中的this
,而不是它包含对象。无论何时在function() { ... }
中包装某些内容,this
都会成为不同的范围。在您的情况下,将对象复制到局部变量并操纵它的.data
属性。
function File(data){
this.data = data;
var file = this; //call the variable whatever you want
this.update = function (callback){
var set = function(ajaxData){
file.data = ajaxData.PcbFile;
}
getPcbFile(data.id, function(ajaxData){
set(ajaxData);
callback();
});
};
}
答案 1 :(得分:4)
缓存this
,以便您可以在其他地方的相同上下文中引用它:
function File(data){
var self = this;
self.data = data;
self.update = function (callback){
var set = function(ajaxData){
self.data = ajaxData.PcbFile;
}
getPcbFile(data.id, function(ajaxData){
set(ajaxData);
callback();
});
};
}
答案 2 :(得分:1)
试试这个:
function File(data){
this.data = data;
var self = this;
this.update = function (callback){
var set = function(ajaxData){
self.data = ajaxData.PcbFile;
}
getPcbFile(data.id, function(ajaxData){
set(ajaxData);
callback();
});
};
}
函数中this
的值取决于函数的调用方式。例如,当您使用“点”符号时,someObj.someMethod()
然后在someMethod()
内,您this
设置为someObj
。您可以使用this
或.apply()
方法将.call()
显式设置为其他对象。否则,如果您使用set(ajaxData)
调用函数,则this
将成为全局对象(window
)。
通过在函数外部保留对this
的引用(我更喜欢变量名self
),您可以在函数内引用它。
答案 3 :(得分:0)
(function(){
var accessible = {
prop1: 'blabla',
verify: function(){
console.log( this.prop1);
return this;
},
deepAccess: function(){
return function(){
accessible.prop1 = 'bloblo';
return function(){
console.log("Deep access ", accessible.prop1);
}
}
},
insideFunction: function(){
//here you can use both 'this' or 'accessible'
this.prop1 = 'bleble';
return this;
},
prop2: 3.1415
};
return accessible;
})().verify().insideFunction().verify().deepAccess()()();
/* console shows:
blabla
bleble
Deep access bloblo
*/