紅顏莎娜
2019-03-12 20:16:50
function Foo(){ getName=function(){alert(1);} console.log(this) return this; } Foo.getName=function(){alert(2);} Foo.prototype.getName=function(){alert(3);} var getName=function(){alert(4);} function getName(){alert(5);}Foo.getName(); //2 這里是不是因為構(gòu)造函數(shù)Foo中的getName方法沒有this關(guān)鍵字,所以就不是1,而是直接采用外部的方法,意思就是Foo對象調(diào)用getName的時候彈出2??getName(); //4Foo().getName(); //1 這里為什么是1呢?是因為Foo返回了this對象,這里的this對象是window,所以這句話的意思不是應(yīng)該等同window.getName()??那應(yīng)該是4啊為什么是1getName(); // 1 這里變成1 是不是因為3的那一步Foo返回了this對象,所以改變了全局函數(shù)getName??所以返回1new Foo.getName();//2new Foo().getName(); //3new new Foo().getName(); //35-7不是很理解,解釋不出原因。5是不是new關(guān)鍵字其實沒起什么作用呢?都只是調(diào)用一個方法而已?
2 回答

滄海一幻覺
TA貢獻(xiàn)1824條經(jīng)驗 獲得超5個贊
Foo.getName(); //2
直接調(diào)用Foo自己的方法,而不是Foo對象的方法。Foo自己的方法是alert(2)那個,所以彈出2。
getName(); //4
這個沒什么好說的,函數(shù)聲明提升。
Foo().getName(); //1
這個就比較微妙了。仔細(xì)看Foo函數(shù),它的getName沒有用var聲明,所以這個getName實際上是window的,所以window的getName會被重新賦值。而它最后又返回了this,由于沒有用new調(diào)用,所以這里的this是window。
綜上,最終彈出的是1。
getName(); // 1
上一步把window的getName重新賦值了,所以這里彈出1。
new Foo.getName();//2
這里的new沒有任何作用。因為Foo沒有加括號,所以它實際上是先調(diào)用Foo.getName(),彈出2,然后再去new它的返回結(jié)果,也就是undefined。
new Foo().getName(); //3
這個加了括號,所以是先new一個Foo對象,再去調(diào)它的getName方法。Foo對象自身沒有g(shù)etName方法,去它的原型上去找,也就是彈出3的那個。
new new Foo().getName(); //3
最前面的new沒意義,實際執(zhí)行的時候是這樣的:new (new Foo().getName())
,括號里的與前一條相同,最后的返回值為undefined,所以最前面那個new沒有實際意義。
添加回答
舉報
0/150
提交
取消