2011-01-29 9 views
1

私はJavaScriptのOOPを解明しようとしていますが、私は以下のことを試しましたが、特定のインスタンスのクラス変数を変更する必要があるときに失敗します。Javascriptクラスのインスタンスの問題

私はデフォルト値で "myname"を持っていますが、それを特定のインスタンスに変更し、イベントハンドラで値を出力します。私は既定値を取得し、更新された値は取得しません。

これをサポートするコードを変更するにはどうすればよいですか?

おかげ

function myClass() {} 

myClass.prototype = 
{ 

    myname : "test", 

    test : function (filename) 
    { 
     var img = createSomething(); 
     img.container = this; 

     img.addEventListener('click', this.onClick);      
    }, 


    onClick : function (e) 
    { 
     trace ("click: " + e.source.container.myname); // this will print "test" and not "dave" 
    } 

}; 



var instance = new myClass(); 

instance.myname = "dave"; 

instance.test(); 

答えて

0

あなたが本当にOOPをしたい場合は、次の操作が必要バインド関数を使用します。これは、グローバルオブジェクトではなくオブジェクトにバインドされているイベントハンドラをアタッチする場合に非常に便利です。

function bind(func, context) { 
    return function() { 
      return func.apply(context, Array.prototype.slice.call(arguments)); 
    } 
} 

次にあなたがthis-

function MyClass() {} 

MyClass.prototype = { 

    myname: "test", 

    test: function(filename) { 
     var img = new Image(); 
     img.src = "http://dummyimage.com/120x90/f00/fff.png&text=my+image" 

     img.addEventListener('click', bind(this.onClick, this), false); 
     document.body.appendChild(img); 
    }, 
    onClick: function(e) { 
     //this here refers to the instance of MyClass 
     console.log("click: " + this.myname); 
    } 
}; 
var instance = new MyClass(); 
instance.myname = "dave"; 
instance.test(); 

PSの操作を行います。慣例として、コンストラクタ関数(または 'クラス')は大文字で始まります。

+0

ご協力いただきありがとうございます –

2

私が何であるかをtrace()e.source知りませんが、私はあなたの例を取ると、console.log()e.target.container.mynameを使用する場合、それは完璧に動作します。

例:http://jsfiddle.net/L2UMC/2/

(例のみにaddEventListenerをサポートするブラウザで動作するように意図されていることに注意してください)

function myClass() {} 

myClass.prototype = { 

    myname: "test", 

    test: function(filename) { 
     var img = new Image(); 
     img.src = "http://dummyimage.com/120x90/f00/fff.png&text=my+image" 
     img.container = this; 

     img.addEventListener('click', this.onClick, false); 
     document.body.appendChild(img); 
    }, 
    onClick: function(e) { 
     console.log("click: " + e.target.container.myname); 
    } 
}; 
var instance = new myClass(); 
instance.myname = "dave"; 
instance.test(); 

EDIT:addEventListenerより互換性を作りました第3引数を追加すると、正しくは@Felix Kling

+2

元のコードをコピーして貼り付けたほうがはるかに少ないと思われますが、少なくともFirefoxでは 'addEventListener'のために3つの引数が必要です:' img.addEventListener( 'click'、this.onClick、false); 'さもないと)。これで少なくとも少し互換性があります;) –

+1

@Felix:情報をありがとう。私はChromeでのみテストしました。私は更新します。主なポイントは、継承が適切に機能していたことでした。これは、ブラウザーとの互換性の点で最も確かに限定されています。 – user113716

0

注:質問への直接の回答ではありません。 JavaScriptでOOPについては

私は強くジョンResig氏自身によって以下のクラスクラスを使用することをお勧めします:http://ejohn.org/blog/simple-javascript-inheritance/

それは継承はそんなに立派になります...