我覺得這是你希望做什麼?
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
參考稱爲context
。 this.next_year
現在通過context
引用了日曆對象。
編輯:一個小的JS教訓迴應評論OP張貼。
當調用一個函數作爲構造(即new
calendar("example")
),則創建一個新的空對象和功能在新的空對象的上下文中執行。
注意:這不是真的只是一個空的對象。這是一個空洞的對象,在原型繼承等事物背後有一些內部指針。
Anywho!在整個函數中,任何對此的引用都是指當前的上下文。而且,因爲當您使用函數作爲構造函數時,它會在新創建的對象的上下文中調用函數,您可以使用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();
,您將在cal1
的背景下撥打next_year()
,因此this.date.setFullYear(this.date.getFullYear()+1);
會按預期將cal1
的日期屬性增加1年。
它不是在單擊事件處理程序中工作,因爲當您設置事件處理程序時,您有點說'點擊'事件被觸發時,執行這個函數「而不是」當'點擊'事件被解僱,執行陳述「。
這實際上是在執行之中的功能:
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 - 不要忘記接受!
你也使用jquery嗎? – Abubakkar
不,不能使用jquery。只有javascript –
如果'Calendar'有一個屬性'id',則可以像'cal1.id'那樣訪問它。 '這是''cal1' – elclanrs