在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/網(wǎng)絡安全  HTML/ js對象,類與原型鏈問題

js對象,類與原型鏈問題

function Foo() {
    getName = function () { console.log (1); };
    return this;
}
Foo.getName = function () { console.log (2);};
Foo.prototype.getName = function () { console.log (3);};
var getName = function () { console.log (4);};
function getName() { console.log (5);}

//請寫出以下輸出結果:
Foo.getName();     //2, 函數(shù)的靜態(tài)方法,直接調(diào)用相關函數(shù)就可以了。
getName();    //4, 變量函數(shù)定義在調(diào)用之前,成功完成初始化,覆蓋函數(shù)聲明方式定義的同名函數(shù)
Foo().getName();   //1, 這里 Foo()返回的 this 是 window,在 Foo調(diào)用時,對全局的變量型函數(shù) getName 重新定義了,所以得到1。
getName();   //1, 上一句改變了全局的 getName 函數(shù)為 cosnole.log(1)
new Foo.getName();   //2,無參數(shù) new 運算比 . 運算低,所以先運行 Foo.getName,得到2
new Foo().getName();   //3,有參數(shù) new 運算和 . 運算同一等級,故從左到右,先運算 new Foo() 得到一個匿名對象,在該對象上調(diào)用 getName 函數(shù)得到3
new new Foo().getName();    //3,同上,先得到匿名對象,然后將該對象的方法 getName 當做構造函數(shù)來調(diào)用,得到一個新對象,并輸出3; 

不理解第三個Foo().getName();的解釋,為什么下面這兩句話沒更改Foo()的getName的值呢?后面幾個new的求解也不是很明白,什么是有參數(shù)無參數(shù)呢

Foo.getName = function () { console.log (2);};
Foo.prototype.getName = function () { console.log (3);};
回答
編輯回答
吢涼

先說第三個:
你可以分開來理解 foo() 執(zhí)行:
第一步window.getName = function(){console.log(1)};
第二步 return this; foo()的調(diào)用對象為 window 即 foo() == window.foo()——> return this == return window ——> foo() == window.foo() == window;
通過第二步可以明白,foo() == window ——> foo().getName() == window.getName()——> console.log(1);

下面的new 的第一個 :
new foo.getName() ——> foo.getName()

第二個

(new foo()).getName() ——> let n = new foo();n.getName();

上面有定義 foo.prototype.getName;

第三個

[new (new foo()).getName()] ——> (new foo.prototype.getName()) 

2017年11月20日 10:27