這個問題其實是來自分析jQuery原始碼的時候,看到裡面使用了var ret = jQuery.merge(this.constructor(), elems );
,裡面this.constructor()回傳的是init方法所建立的空的實例物件。因此對其中this的指向產生疑惑。
以下為試驗程式碼:
function Person() { this.name = 'ddadaa'; console.log(this); } var p1 = new Person(); p1.constructor(); // Person {name: "ddadaa"} var p2 = p1.constructor; p2(); //打印的是window
這裡為什麼直接呼叫constructor(),裡面的this的指向就發生了改變,並且自動建立了一個新的物件?是不是constructor()方法的內部實作對此有所影響?
這個和
this指向window。constructor()
方法的內部實作沒有什麼關係,其實就是函數內this指向的問題。當函數作為物件的屬性被呼叫的時候,
this
指向這個物件;當函數直接呼叫的時候,在非嚴格模式下,
this
指向window
;p1.conoror
的就是window
;p1.conoror
Person
函數,當呼叫p1.constructor();
時,Person
是作為p1
的屬性被呼叫的,所以this
指向p1
;當呼叫var p2 = p1.conorstructp. );
時,其實就等於直接呼叫Person();
,所以