有意思的一道js題目(原型相關(guān))

題目如下:

function Foo() {
    getName = function () { alert (1); };
    return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
 
//請寫出以下輸出結(jié)果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
首先分析一下題目

getName分別以變量,和函數(shù)變量的形式聲明肿仑,涉及到變量聲明提升致盟。因此實際執(zhí)行是

function Foo() {
    getName = function () { alert (1); };
    return this;
}
var getName;//只提升變量聲明
function getName() { alert (5);}//覆蓋var的聲明
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
getName = function () { alert (4);};

第一問

Foo.getName(); 自然是訪問Foo函數(shù)上存儲的靜態(tài)屬性//2

第二問

getName();也可由以上分析易得4;

第三問

Foo().getName();先執(zhí)行Foo()函數(shù),然后調(diào)用Foo函數(shù)的返回值對象的getName屬性函數(shù)尤慰。
執(zhí)行Foo()函數(shù)返回this,這里是window馏锡,也就等于window.getName();然后Foo()執(zhí)行過程中g(shù)etName沒有var聲明,是全局變量伟端,因此也就修改了先前的getName函數(shù)杯道,此時代碼可認為是

function Foo() {
        getName = function () { alert (1); };
        return this;
    }
var getName;//只提升變量聲明
function getName() { alert (5);}//覆蓋var的聲明
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
getName=function(){alert(1);}//覆蓋上文getName定義

所以輸出1;

第四問

getName();和上一問一樣,直接輸出1;

第五問

new Foo.getName();后面幾問考察到j(luò)s運算符優(yōu)先級。
詳細優(yōu)先級匯總表點擊這里

部分優(yōu)先級

上圖優(yōu)先級從高到低排列;.優(yōu)先級高于new,這里的new我認為是無參的荔泳,因此優(yōu)先級最低蕉饼。
所以是new ((Foo.getName)())
也就是把Foo.getName()函數(shù)作為了構(gòu)造函數(shù)來執(zhí)行。

第六問

new Foo().getName()

//?此時的點不是成員訪問運算了么玛歌,作者說等于(new Foo()).getName()

先執(zhí)行new Foo()

構(gòu)造函數(shù)的返回值

分三種情況:

  • 沒有返回值昧港,返回實例化對象。
    function Foo(){};
    >undefined;
    new Foo()
    >Foo {}
  • 若有返回值檢查其返回值是否為引用類型支子。如果是非引用類型创肥,如基本類型(string、number、boolean叹侄、null巩搏、undefind)則與無返回值相同,返回實例化對象趾代。
    function Fn(){return true}
    >undefined
    new Fn()
    >Fn {}
  • 若返回值是引用類型贯底,則實際返回值為這個引用類型。
    function fn(){return {a:1}}
    >undefined
    new fn()
    >Object {a: 1}

this不能當做引用類型

回到題目撒强,new Foo().getName() 禽捆,原題中返回this,代表當前實例化對象,然后調(diào)用實例化對象的getName(),//3

第七問

new new Foo().getName();

最終等于new ((new Foo()).getName)();

//這里的順序也是一個問題

先初始化Foo的實例化對象,將其原型上的getName作為構(gòu)造函數(shù)再次new飘哨,還是3.

總結(jié)

對于后面幾個問題來說胚想,與其用優(yōu)先級的知識來解釋,還不如用(new 構(gòu)造函數(shù))更加通俗易懂芽隆。譬如 new Foo(),返回Foo函數(shù)的一個實例Foo{},然后總不能再new一個實例吧浊服,所以只能等后邊再結(jié)合成一個函數(shù),就像第五問 new Foo.getName() ,Foo只是個函數(shù)名,而Foo.getName()是個函數(shù)胚吁。第六問new Foo().getName(),Foo()是一個函數(shù)牙躺,就直接new 了,然后返回Foo的實例Foo{},再找繼承的getName()囤采;第七問new new Foo().getName(),(new Foo())返回實例述呐,所以再和后面的結(jié)合成一個函數(shù),然后再new蕉毯。不知道這樣理解有多少問題,還請各位賜教~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末思犁,一起剝皮案震驚了整個濱河市代虾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌激蹲,老刑警劉巖棉磨,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異学辱,居然都是意外死亡乘瓤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門策泣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衙傀,“玉大人,你說我怎么就攤上這事萨咕⊥程В” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長聪建。 經(jīng)常有香客問我钙畔,道長,這世上最難降的妖魔是什么金麸? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任擎析,我火速辦了婚禮,結(jié)果婚禮上挥下,老公的妹妹穿的比我還像新娘叔锐。我一直安慰自己,他們只是感情好见秽,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布愉烙。 她就那樣靜靜地躺著,像睡著了一般解取。 火紅的嫁衣襯著肌膚如雪步责。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天禀苦,我揣著相機與錄音蔓肯,去河邊找鬼。 笑死振乏,一個胖子當著我的面吹牛蔗包,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慧邮,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼调限,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了误澳?” 一聲冷哼從身側(cè)響起耻矮,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忆谓,沒想到半個月后裆装,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡倡缠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年哨免,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昙沦。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡琢唾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桅滋,到底是詐尸還是另有隱情慧耍,我是刑警寧澤身辨,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芍碧,受9級特大地震影響煌珊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泌豆,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一定庵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踪危,春花似錦蔬浙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓝仲,卻和暖如春俱病,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袱结。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工亮隙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垢夹。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓溢吻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親果元。 傳聞我的和親對象是個殘疾皇子促王,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容