国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一道面試題引發(fā)的思考 --- 理解 new 運(yùn)算符

shengguo / 3383人閱讀

摘要:首先,我先去上搜索了的定義運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象的實(shí)例。

今天看到一道面試題,如下,問(wèn): 實(shí)例化 Person 過(guò)程中,Person返回什么(或者 p 等于什么)?

function Person(name) {
    this.name = name
    return name;
}
let p = new Person("Tom");

說(shuō)實(shí)話,第一反應(yīng)我以為值為 "Tom",等到我把代碼丟到控制臺(tái)一輸出,才明白我錯(cuò)了。天吶,new運(yùn)算符給無(wú)視掉了嗎???
撇開(kāi) new 的存在,我們修改下代碼

function Person(name) {
    this.name = name
    return name;
}
let p = Person("Tom");
console.log(p);

很顯然,輸出的結(jié)果是 "Tom", 但是有 new 存在呢?接下去,我們來(lái)捋一捋。
首先,我先去 MDN上搜索了 new 的定義

new 運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象的實(shí)例。

emmmm,相當(dāng)晦澀難懂。

那我們?cè)囍鴮?xiě)幾個(gè)栗子看看結(jié)果吧

function Person1(name) {
  this.name = name;
  // 沒(méi)有返回值
}

function Person2(name) {
  this.name = name;
  return name;
  // 返回非對(duì)象
}

function Person3(name) {
  this.name = name;
  return { a: 1 };
  // 返回對(duì)象
}

function Person4(name) {
  this.name = name;
  return null;
  // 返回null
}

var p1 = new Person1("aa");
var p2 = new Person2("bb");
var p3 = new Person3("cc");
var p4 = new Person4("dd");

console.log(p1); // Person1?{name: "aa"}
console.log(p2); // Person2?{name: "bb"}
console.log(p3); // {a: 1}
console.log(p4); // Person4?{name: "dd"}

根據(jù)上面幾個(gè)栗子,我們能得出結(jié)論:當(dāng)使用 new 來(lái)創(chuàng)建對(duì)象||調(diào)用構(gòu)造函數(shù)時(shí),如果函數(shù)沒(méi)有返回值|| 返回值是非對(duì)象,那么返回的就是構(gòu)造函數(shù)實(shí)例后的對(duì)象;如果函數(shù)return對(duì)象,那么返回這個(gè)對(duì)象(特例:return null,返回的也是構(gòu)造函數(shù)實(shí)例后的對(duì)象而非null)

我們接著看 MDN 文檔的解釋,畢竟光光看這幾個(gè)demo沒(méi)有說(shuō)服力。

一起來(lái)理解下 new 到底做了什么工作吧~
就拿下面這個(gè) demo分析

function Person(name) {
  this.name = name;
  return {a: 1}
}
var p = new Person("fefeng")

當(dāng)調(diào)用 new Person(...)時(shí),會(huì)進(jìn)行以下幾步:

首先是 繼承自 Person.prototype的新對(duì)象會(huì)被創(chuàng)建

使用參數(shù) "fefeng" 調(diào)用構(gòu)造函數(shù) Person, 并將 this 綁定到新創(chuàng)建的對(duì)象

Person 返回的對(duì)象就是 new 表達(dá)式的結(jié)果 =》 Person 返回的對(duì)象是 {a: 1} 所以new 表達(dá)式的結(jié)果為 {a:1} ; 如果 Person 沒(méi)有返回值(一般構(gòu)造函數(shù)都不返回值)那么使用步驟1創(chuàng)建的對(duì)象,即==》 繼承自 Person.prototype 的新對(duì)象

貌似照著文檔能夠些許理解了,倘若模擬實(shí)現(xiàn) new運(yùn)算符更能深入理解 new
以下是 new 的模擬實(shí)現(xiàn),代碼來(lái)源 : JavaScript深入之new的模擬實(shí)現(xiàn)

function objectFactory() {
  var obj = new Object(),
  cons = [].shift.call(arguments)
  obj.__proto__ = cons.prototype
  var ret = cons.apply(obj, arguments)
  return typeof ret === "object" ? ret|| obj : obj
}
function Person(name) {
  this.name = name;
  return {a: 1}
}
var p = objectFactory(Person, "fefeng")

當(dāng)然了,學(xué)習(xí)別人的代碼不能僅僅只是照搬過(guò)來(lái),起碼得理解這個(gè)代碼吧。
使用

首先是創(chuàng)建一個(gè)對(duì)象,

cons 是調(diào)用 objectFactory 方法的第一個(gè)參數(shù),即構(gòu)造函數(shù); 因?yàn)?shift 會(huì)改變?cè)瓟?shù)組,所以改變后的 argument 即為調(diào)用構(gòu)造函數(shù)的參數(shù) (這里補(bǔ)充說(shuō)明下: arguments 是一個(gè)對(duì)應(yīng)于傳遞給函數(shù)的參數(shù)的類數(shù)組對(duì)象。)

obj 的原型指向構(gòu)造函數(shù), 這樣 obj 就能訪問(wèn)到構(gòu)造函數(shù)原型上的屬性

將構(gòu)造函數(shù) consthis 指向 obj,這樣 obj 能訪問(wèn)構(gòu)造函數(shù)里的屬性

判斷返回的值是不是一個(gè)對(duì)象,如果是對(duì)象即返回它(當(dāng)然這里要處理 return null 的特例);如果不是對(duì)象就返回 obj (注意:這里的 obj 已經(jīng)不是一個(gè)空對(duì)象)

如果你耐心看到了這里,那么十分感謝。如文章有錯(cuò)誤,望給予指正~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/100230.html

相關(guān)文章

  • 一道前端面試引發(fā)思考

    摘要:直接開(kāi)始題目是厲害了說(shuō)句實(shí)話開(kāi)發(fā)中誰(shuí)寫(xiě)成這樣保證會(huì)被打死。不過(guò)面試就是面試,有面試官的考量點(diǎn)。官方是這么說(shuō)的。結(jié)果完美,不過(guò)小姐姐的意思是數(shù)組的方法會(huì)自動(dòng)觸發(fā)數(shù)組的。 直接開(kāi)始題目是 if(a==1 && a==2 && a==3){ alert(厲害了) } 說(shuō)句實(shí)話開(kāi)發(fā)中誰(shuí)寫(xiě)成這樣保證會(huì)被打死。 不過(guò)面試就是面試,有面試官的考量點(diǎn)。 我理解的點(diǎn)有兩個(gè) 1、隱式類型轉(zhuǎn)換 先說(shuō)...

    gaomysion 評(píng)論0 收藏0
  • 一道面試引發(fā)思考 --- Event Loop

    摘要:想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出個(gè),可是你真的懂為什么嗎為什么是輸出為什么是輸出個(gè)這兩個(gè)問(wèn)題在我腦邊縈繞。同步任務(wù)都好理解,一個(gè)執(zhí)行完執(zhí)行下一個(gè)。本文只是我對(duì)這道面試題的一點(diǎn)思考,有誤的地方望批評(píng)指正。 想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出10個(gè)10,可是你真的懂為什么嗎?為什么是輸出10?為什么是輸出10個(gè)10?這兩個(gè)問(wèn)題在我腦...

    betacat 評(píng)論0 收藏0
  • 一道面試引發(fā)思考

    摘要:下面我們來(lái)使用面向?qū)ο箢悎D這里就不再畫(huà)了首先面試題中所提到的我們都可以看成類,比如停車場(chǎng)是一個(gè)類吧,它里面的車位是一個(gè)類吧,攝像頭,屏幕。。。 以下是某場(chǎng)的一道面試題(大概): 1、一個(gè)停車場(chǎng),車輛入場(chǎng)時(shí),攝像頭記錄下車輛信息2、屏幕上顯示所接收的車輛的信息情況(車牌號(hào))以及各層車位的車位余量3、停車場(chǎng)一共四層車位,其中的三層都為普通車位,還有一層為特殊車位(體現(xiàn)在停車計(jì)費(fèi)價(jià)格上面的不...

    Apollo 評(píng)論0 收藏0
  • 一道面試引發(fā)思考

    摘要:下面我們來(lái)使用面向?qū)ο箢悎D這里就不再畫(huà)了首先面試題中所提到的我們都可以看成類,比如停車場(chǎng)是一個(gè)類吧,它里面的車位是一個(gè)類吧,攝像頭,屏幕。。。 以下是某場(chǎng)的一道面試題(大概): 1、一個(gè)停車場(chǎng),車輛入場(chǎng)時(shí),攝像頭記錄下車輛信息2、屏幕上顯示所接收的車輛的信息情況(車牌號(hào))以及各層車位的車位余量3、停車場(chǎng)一共四層車位,其中的三層都為普通車位,還有一層為特殊車位(體現(xiàn)在停車計(jì)費(fèi)價(jià)格上面的不...

    soasme 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<