我试图使用"类" (原型)在javascript上,我有一个奇怪的" undefined"错误。
/**
* Use the camera to take a picture and use it as custom image.
*/
function CameraMedia(imgTag, saveButton){
this.__camera__ = navigator.camera;
this.__imageTag__ = imgTag;
this.__saveButton__ = saveButton;
this.__selectedImage__ = null;
}
/**
* Executes the camera of the device.
* @param {Object} type selects between gallery or camera. Parameters could be "GALLERY" or "CAMERA" ignoring case.
*/
CameraMedia.prototype.run = function(type){
var that = this;
function onDeviceReady(){
var options = {
quality: 50,
allowEdit : true
};
that.__camera__.getPicture(that.__successOperation__, that.__errorOperation__, options);
}
document.addEventListener("deviceready", onDeviceReady, true);
};
/**
* Operation that might be performed in case of success in taking the image.
*/
CameraMedia.prototype.__successOperation__ = function(imageData){
this.__selectedImage__ = imageData;
$(this.__imageTag__).attr("src", imageData);
$(this.__imageTag__).attr("image-changed", true);
$(this.__saveButton__).show();
}
/**
* Operation that might be performed in case of error in taking the image.
*/
CameraMedia.prototype.__errorOperation__ = function(message){
alert(message);
}
问题是this
上的__successOperation__
个元素没有引用CameraMedia对象。
感谢。
答案 0 :(得分:2)
这很正常。您正在将函数从对象(基本上是散列映射)传递给回调,而不是整个对象。
要解决这个问题,jQuery有一个代理方法(下划线有一个绑定方法),它们是这样的:
that.__camera__.getPicture($.proxy(that.__successOperation__, that), that.__errorOperation__, options);
如果你想使用vanilla javascript,你也可以实现这个目标(例3):
var a = {
data: "1",
func: function() {
console.log(this.data);
}
};
//This will log out undefined (Example #1)
var myFunction = function(callback) {
callback();
};
myFunction(a.func);
//This will work (Example #2)
var myFunction2 = function(callback) {
callback.func();
};
myFunction2(a);
//This will also work (Example #3)
myFunction(function() {
a.func()
});
JSFiddle:http://jsfiddle.net/PBxFs/