1

javascriptで「クラス」(プロトタイプ)を使用しようとしていますが、奇妙な「未定義」エラーが発生しています。

/**
 * 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オブジェクトを参照していないことです。ありがとう。

4

1 に答える 1

2

これは正常です。オブジェクト全体ではなく、オブジェクト(基本的にはハッシュマップ)からコールバックに関数を渡します。

これを回避するために、jQueryにはプロキシメソッドがあり(アンダースコアにはバインドメソッドがあります)、次のようになります。

that.__camera__.getPicture($.proxy(that.__successOperation__, that), that.__errorOperation__, options);

バニラ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/

于 2012-08-23T08:06:47.197 に答える