これがあなたがやろうとしていることだと思います...
function calendar(id){
this.date=new Date();
this.id=id;
var context = this;
this.next_year=function(){
context.date.setFullYear(context.date.getFullYear()+1);
alert(context.date);//basically i want to get object context here to change date
}
var temp_but=document.createElement("button").onclick=this.next_year;
document.getElementById(id+"_div").appendChild(temp_but);
document.getElementById(id+"_div").lastChild.onclick=this.next_year;
}
this
基本的に、 calledへの参照を保持するためにクロージャーを使用していますcontext
。this.next_year
は、 を介してカレンダー オブジェクトへの参照を持つようになりましたcontext
。
編集:投稿されたコメントOPに対応する小さなJSレッスン。
関数をコンストラクター (つまり ) として呼び出すと、新しい空のオブジェクトが作成され、新しい空のオブジェクトのコンテキストで関数が実行されます。new
calendar("example")
注: 実際には単なる空のオブジェクトではありません。これは、プロトタイプの継承などのために舞台裏で特定の内部ポインターを持つ空のオブジェクトです。
だれでも!関数全体で、 this への参照は現在のコンテキストを参照します。また、関数をコンストラクタとして使用すると、新しく作成されたオブジェクトのコンテキストで関数が呼び出されるため、 を使用してオブジェクトのプロパティを設定できますthis.someProperty
。
ステートメントを実行するvar cal1=new calendar("inputfield_id");
と、新しいオブジェクトが作成calendar
され、そのオブジェクトのコンテキストで関数が実行されます。そのため、新しいカレンダー オブジェクトの プロパティと プロパティをthis.date=new Date();
設定this.id=id
していdate
ます。id
ここで何が起こっているのかを実際に理解するのに苦労しているのではなく、キーワードが で機能しなかっthis.id=id;
た理由を理解していると思います。this
this.next_year
それが機能するシナリオから始めましょう。を呼び出す場合は、 のコンテキストでcal1.next_year();
呼び出すことになるため、予想どおり の日付プロパティが 1 年ずつ増加します。next_year()
cal1
this.date.setFullYear(this.date.getFullYear()+1);
cal1
イベントハンドラーを設定すると、「「クリック」イベントが発生したときではなく、「「クリック」イベントが発生したときにこの関数を実行する」と言ってしまうため、クリックイベントハンドラーでは機能しませんでした。、このステートメントを実行します"。
実際に実行されている関数は次のとおりです。
function(){
this.date.setFullYear(this.date.getFullYear()+1);
alert(this.date);
}
実行することを期待していたステートメントは次のとおりです。
this.next_year(); //where this refers to the calendar object.
このコードが実行されると、
elem.onclick = this.next_year;
と言っているのと同じです。
elem.onclick = function(){
this.date.setFullYear(this.date.getFullYear()+1);
alert(this.date);
}
これで問題が十分に明確にならない場合は、もう少し進んで、elem
を使用してクリック ハンドラを設定した後に要素 がクリックされたときに実際に何が起こるかを説明しますelem.onclick=this.next_year;
。ブラウザが を呼び出しているかのように考えるのが好きですelem.onclick([Event event]);
。基本的に、使用して設定した関数elem.onclick=
は のコンテキストで実行されelem
、Event
オブジェクトが最初で唯一の引数として渡されます。
露骨に明確にしてポイントを家に追いやるためthis
に、関数のキーワードは、イベントハンドラーとしてブラウザーによって呼び出されたときにクリックされた要素を指します。
function(){
this.date.setFullYear(this.date.getFullYear()+1);
alert(this.date);
}
説明が過剰で、繰り返し/冗長であることをお詫びします。私は一般的に物事を説明するのが苦手なので、答えを短くするようにしています :P
PS - 受け入れることを忘れないでください!