Masalah ini sebenarnya datang daripada semasa menganalisis kod sumber jQuery, saya melihat bahawavar ret = jQuery.merge(this.constructor(), elems );
digunakan di dalamnya, dan this.constructor() mengembalikan objek contoh kosong yang dicipta oleh kaedah init. Oleh itu, saya keliru tentang hala tuju ini.
Berikut ialah kod ujian:
function Person() { this.name = 'ddadaa'; console.log(this); } var p1 = new Person(); p1.constructor(); // Person {name: "ddadaa"} var p2 = p1.constructor; p2(); //打印的是window
Mengapa penunjuk ini ditukar apabila constructor() dipanggil terus di sini, dan objek baharu dicipta secara automatik? Adakah pelaksanaan dalaman kaedah constructor() mempunyai kesan ke atas ini?
Ini dan
constructor()
方法的内部实现没有什么关系,其实就是函数内this指向的问题。当函数作为对象的属性调用的时候,
this
指向这个对象;当函数直接调用的时候,在非严格模式下,
this
指向window
;p1.constructor
指向的就是Person
函数,当调用p1.constructor();
时,Person
是作为p1
的属性调用的,所以this
指向p1
;当调用var p2 = p1.constructor;p2();
时,其实就相当于直接调用Person();
,所以this
指向window
.