模擬實(shí)現(xiàn)new

mdn關(guān)于new運(yùn)算符的介紹:

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

是不是看著有點(diǎn)懵,那我們用實(shí)例來看看new運(yùn)算符到底做了什么鸵贬;
第一版:

function Person(name){
  this.name = name
}
Person.prototype.say = function(){
  console.log(`i'm ${this.name}`)
}
let student = new Person('小明')
console.log(student.name) // 小明
student.say() // i'm 小明

這里我們可以看出 通過new 創(chuàng)建的實(shí)例 student 可以訪問 Person的 屬性以及Person 定義在原型鏈上的方法脚线;
那么開始實(shí)現(xiàn):

function newObj(obj, ...args) {
  // 創(chuàng)建一個(gè)空對象
  let newObj = new Object()
  // 將newObj的this指向obj
  obj.apply(newObj, args)
  // 將newObj的原型指向構(gòu)造函數(shù)的prototype
  newObj.__proto__ = obj.prototype
  // 返回
  return newObj
}
function Person(name) {
  this.name = name
}
Person.prototype.say = function () {
  console.log(`i'm ${this.name}`)
}
// 測試一下
let a = newObj(Person, '小花')
console.log(a.name) // 小花
a.say() // i'm 小花

這里我們實(shí)現(xiàn)了new的基本功能,測試通過例隆。

  1. 如果構(gòu)造函數(shù)有返回值:
  • 返回一個(gè)基本類型
function Person(name) {
  this.name = name
  return '小白'
}
Person.prototype.say = function () {
  console.log(`i'm ${this.name}`)
}
let student = new Person('小明')
console.log(student.name) // 小明
student.say() // i'm 小明

這里可以看出當(dāng)返回值為基本類型時(shí)甥捺,并沒有什么區(qū)別,返回的還是內(nèi)部創(chuàng)建的對象镀层;

  • 返回值是一個(gè)對象
function Person(name) {
  this.name = name
  return {Teacher:'小白'}
}
Person.prototype.say = function () {
  console.log(`i'm ${this.name}`)
}
let student = new Person('小明')
console.log(student) // {Teacher:'小白'}
console.log(student.name) // undefined

這里我們可以看出镰禾,當(dāng)構(gòu)造函數(shù)內(nèi)部返回一個(gè)對象時(shí);函數(shù)內(nèi)部的對象會直接覆蓋我們內(nèi)部創(chuàng)建的那個(gè)函數(shù)。

[mdn]如果構(gòu)造函數(shù)返回了一個(gè)“對象”吴侦,那么這個(gè)對象會取代整個(gè)new出來的結(jié)果屋休。如果構(gòu)造函數(shù)沒有返回對象,那么new出來的結(jié)果為步驟1創(chuàng)建的對象备韧。(一般情況下構(gòu)造函數(shù)不返回任何值劫樟,不過用戶如果想覆蓋這個(gè)返回值,可以自己選擇返回一個(gè)普通對象來覆蓋织堂。當(dāng)然叠艳,返回?cái)?shù)組也會覆蓋,因?yàn)閿?shù)組也是對象易阳。
  • 繼續(xù)實(shí)現(xiàn):
function newObj(obj, ...args) {
  // 創(chuàng)建一個(gè)空對象
  let newObj = new Object()
  // 將newObj的原型指向構(gòu)造函數(shù)的prototype
  newObj.__proto__ = obj.prototype
  // 將newObj的this指向obj
  let ret = obj.apply(newObj, args)
  // 判斷返回值 如果返回值為對象就返回這個(gè)對象 返回值不為對象 就返回創(chuàng)建的對象
  return typeof ret === 'object' ? ret : newObj
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末附较,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闽烙,更是在濱河造成了極大的恐慌翅睛,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黑竞,死亡現(xiàn)場離奇詭異捕发,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)很魂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門扎酷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遏匆,你說我怎么就攤上這事法挨。” “怎么了幅聘?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵凡纳,是天一觀的道長。 經(jīng)常有香客問我帝蒿,道長荐糜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任葛超,我火速辦了婚禮暴氏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绣张。我一直安慰自己答渔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布侥涵。 她就那樣靜靜地躺著沼撕,像睡著了一般宋雏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上端朵,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天好芭,我揣著相機(jī)與錄音,去河邊找鬼冲呢。 笑死舍败,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敬拓。 我是一名探鬼主播邻薯,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乘凸!你這毒婦竟也來了厕诡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤营勤,失蹤者是張志新(化名)和其女友劉穎灵嫌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛作,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寿羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赂蠢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绪穆。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虱岂,靈堂內(nèi)的尸體忽然破棺而出玖院,到底是詐尸還是另有隱情,我是刑警寧澤第岖,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布难菌,位于F島的核電站,受9級特大地震影響蔑滓,放射性物質(zhì)發(fā)生泄漏郊酒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一烫饼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧试读,春花似錦杠纵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铝量。三九已至,卻和暖如春银亲,著一層夾襖步出監(jiān)牢的瞬間慢叨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工务蝠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拍谐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓馏段,卻偏偏與公主長得像轩拨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子院喜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法亡蓉,類相關(guān)的語法,內(nèi)部類的語法喷舀,繼承相關(guān)的語法砍濒,異常的語法,線程的語...
    子非魚_t_閱讀 31,665評論 18 399
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,523評論 1 51
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,238評論 0 4
  • 青島車站硫麻,藍(lán)色站牌爸邢,列車在站臺停靠庶香,朦朧著眼睛一個(gè)人背著包走到寂靜的出口甲棍,看著熟悉的風(fēng)景,我才緩過神來赶掖。前幾小時(shí)感猛,...
    木頭馬尾_V閱讀 422評論 0 2
  • 許多產(chǎn)品或服務(wù)都具備兩種以上屬性,這些屬性看似毫不相關(guān)奢赂,可一旦發(fā)生關(guān)聯(lián)陪白,就會引發(fā)創(chuàng)新的奇跡,千變?nèi)f化膳灶。給屬性裝上一...
    王炳煒閱讀 855評論 0 0