JS 操作符優(yōu)先級(jí)及new

基于segmentfault上的一道題

題目

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);}
new foo.getName ();      // 第一種       
new foo().getName ();         // 第二種
new new foo().getName ();       // 第三種
    
  • 首先先了解下優(yōu)先級(jí)(由高到低)


    MDN

由此可以知道new 的優(yōu)先級(jí)帶參數(shù)的比不帶的高

解析

  • 第一種
    new foo.getName (); '.'的優(yōu)先級(jí)比new高
    所以先執(zhí)行foo.getName,在來(lái)執(zhí)行new
    也就是new (foo.getName) () // 返回一個(gè)foo.getName的實(shí)力 獲得就是2
  • 第二種
    new foo().getName (); 主要猶豫的地方是先f(wàn)oo()函數(shù)運(yùn)算還是先new
    foo()先new (foo().getName)()
    new 先 (new foo()).getName()
    如果new 不帶參數(shù)的優(yōu)先級(jí)確實(shí)比函數(shù)調(diào)用的優(yōu)先級(jí)低,但現(xiàn)在new是帶參數(shù)的所有優(yōu)先級(jí)
    所以執(zhí)行的 (new foo()).getName() // foo()上的getName方法,但是沒有這個(gè)方法所以去原型上找,結(jié)果為3
  • 第三種
    new new foo().getName (); 從上面分析得,new帶參數(shù)會(huì)優(yōu)先執(zhí)行,這是在從左至右的運(yùn)算基礎(chǔ)下實(shí)現(xiàn)的
    也就是第一步new (new foo().getName)()
    第二步 new ((new foo()).getName)()
    最后進(jìn)行運(yùn)算 先計(jì)算new foo(), 在獲取getName,在對(duì)獲取內(nèi)容進(jìn)行new ()計(jì)算
    new ((new foo()).getName)() 也就是 new (foo.prototype.getName)()
    返回的就是3, 具體可以看下面new 原理解析

new原理

在第三種解析中我們要計(jì)算 new (foo.prototype.getName)()的值,首先要明白new到底做了什么,其實(shí)就做了3件事

var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

第一步:創(chuàng)建一個(gè)空對(duì)象
第二步:綁定該對(duì)象的原型
第三部:調(diào)用構(gòu)造函數(shù) // 執(zhí)行了構(gòu)造函數(shù)的內(nèi)容
所以在 new (foo.prototype.getName)()也就會(huì)返回foo.prototype.getName的一個(gè)實(shí)例,并且執(zhí)行一次構(gòu)造函數(shù),也就是執(zhí)行console.log(3),打印3這個(gè)結(jié)果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 最近在網(wǎng)上看了一道有關(guān)前端的面試題感覺很不錯(cuò),就在這里分享給大家。 題目: function Foo() { g...
    穿越人海遇見你閱讀 1,035評(píng)論 0 12
  • Github原文 題目 這幾天面試上幾次碰上這道經(jīng)典的題目,特地從頭到尾來(lái)分析一次答案,這道題的經(jīng)典之處在于它綜合...
    秋風(fēng)喵閱讀 950評(píng)論 0 19
  • 題目 題目如上,這道題的經(jīng)典之處在于它綜合考察了面試者的JavaScript的綜合能力,包含了變量定義提升、thi...
    庸者的救贖閱讀 2,267評(píng)論 12 27
  • 日短夜無(wú)眠,夜長(zhǎng)朝尚睡。 漸生冬暮光,已夢(mèng)春滋味。 鵲報(bào)喜梅枝,花開嘉景致。 初從醒眼迷,再向閑心醉。 畢竟動(dòng)吟情...
    雪窗_武立之閱讀 255評(píng)論 4 3

友情鏈接更多精彩內(nèi)容