※ ChatGPTを利用し、要約された質問です(原文:JS 親functionのフィールドを参照したい)
JS 親functionのフィールドを参照したい
このQ&Aのポイント
JavaScriptでボタンをクリックすると、任意の文字がalertで表示されるHTMLを生成するプログラムを作成したい。
ButtonMakerクラスを使用してボタンを生成し、クリックした際に表示されるメッセージを参照したいが、eventMakerメソッドでthisを使用する必要があり、それが嫌である。
また、引数を使用してメッセージを渡す方法も避けたい。
ボタンをクリックすると、任意の文字がalertで表示されるHTMLを生成するプログラムをJavaScriptで(JQueryを使用しています)書いています。
イメージは、
<button onclick='alert(任意の文字列)'>CLICK ME!</button> のようなHTMLです。
JavaScript部分は以下です。
var ButtonMaker = function(msg){
this.msg = msg;
}
ButtonMaker.prototype = {
getButton: function(){
var button = $('<button>').text('CLICK ME!');
button.click(this.eventMaker());
return button;
},
eventMaker: function(){
var that = this; // ←これをしたくありません
return function(){
alert(that.msg);
}
}
}
// 以下のようにして使います
var bmaker = new ButtonMaker('This is a message.');
$(document.body).append(bmaker.getButton());
上記のコードを実行すれば、自分の思い通りの動きになります。ですが、eventMaker()メソッドが気に入りません。var that = thisをしたあと、that.msgなどとして参照しないといけないのが嫌です。
また、以下のコードのようにeventMaker()にmsgを引数に渡すのもあまりしたくありません。なぜなら、実際はButtonMakerのフィールドがもっとたくさんあり、それらのいくつかを参照するからです。
eventMaker2: function(msg){
return function(){
alert(msg);
}
}
よろしくお願いします
お礼
ありがとうございます bind()というのは知りませんでした。「>本質的に同じ発想で、次のようにもできます:」はより見やすくて良いと思いました。 よくわからないのが、「this.event = this.event.bind(this);」です。右辺のthis.event.bind(this)のthis.eventはメソッドなのでしょうか?そして、その左辺のthis.eventは新しく定義しているですよね?もしかして、eventという識別子が上書きされているのでしょうか? もしよろしければ、この質問にも回答お願いできませんか?