再學(xué)JS--new的模擬實現(xiàn)

什么是new丑婿?

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

舉個例子說明下:

function Otaku(name, age) {
    this.name = name
    this.age = age
    this.habit = 'Games'
}

Otaku.prototype.strength = 60

Otaku.prototype.sayYourName = function() {
    console.log('I am' + this.name)
}

var person = new Otaku('Kevin', 18)

console.log(person.name)  // 'Kevin'
console.log(person.age)  // 18
console.log(person.habit) // 'Games'

person.sayYourName() // I am Kevin

從上面的例子中扛伍,實例person可以:

  1. 訪問到Otaku構(gòu)造函數(shù)中的屬性
  2. 訪問到Otaku.prototype中的屬性
ps: new一個對象的過長
  1. 創(chuàng)建一個空對象
  2. 設(shè)置新對象的constructor屬性為構(gòu)造函數(shù)躏嚎,設(shè)置新對象__proto__屬性指向構(gòu)造函數(shù)的prototype對象
  3. 使用新對象調(diào)用函數(shù),函數(shù)中的this被指向到新對象的實例
  4. 將初始化完畢的新對象地址辅柴,保存到等號左邊的變量中

初步實現(xiàn)

因為new是關(guān)鍵字舟舒,所有我們寫一個函數(shù)來模擬new的實現(xiàn)煤伟。

分析:

  1. 因為new的結(jié)果是一個新對象癌佩,所以在模擬的時候,我們也要建立一個新對象便锨,假設(shè)這個對象為obj围辙,因為obj會具有Otaku構(gòu)造函數(shù)的屬性,我們可以用Otaku.apply(obj, arguments)來給obj添加新的屬性放案。
  2. 實例的__proto__屬性會指向構(gòu)造函數(shù)的prototype姚建,正是因為建立起這樣的關(guān)系,實例可以訪問原型上的屬性

第一版模擬:

function objectFactory() {
    var obj = new Object()
    var Constructor = [].shift.call(arguments)
    obj.__proto__ = Constructor.prototype
    Constructor.apply(obj, arguments)
    return obj
}

這一版中:

  1. 利用new Object()的方式新建了obj
  2. 取出第一個參數(shù)吱殉,就是我們傳入的構(gòu)造函數(shù)掸冤。此外因為shirt會修改原數(shù)組厘托,所以arguments會被去除第一個參數(shù)
  3. 將obj的原型指向構(gòu)造函數(shù),這樣obj就可以訪問到構(gòu)造函數(shù)原型中的屬性
  4. 使用apply稿湿,改變構(gòu)造函數(shù)this的指向到新建的對象铅匹,這樣obj就可以訪問到構(gòu)造函數(shù)中的屬性
  5. 返回obj

返回效果的實現(xiàn)

假如構(gòu)造函數(shù)有返回值,且返回值是一個對象的時候

function Otaku(name, age) {
    this.name = name
    this.age = age
    this.habit = 'Games'

    return {
        name: 'Kevin1',
        habit: 'Games1'
    }
}

var person = new Otaku('Kevin', 18)

console.log(person.name)  // 'Kevin1'
console.log(person.age)  // undefined
console.log(person.habit) // 'Games1'

從上面的例子中可以看到饺藤,實例person只能訪問返回的對象中的屬性包斑。

如返回值是一個基本類型的值:

function Otaku(name, age) {
    this.name = name
    this.age = age
    this.habit = 'Games'

    return 'Otaku Factory'
}

var person = new Otaku('Kevin', 18)

console.log(person.name)  // 'Kevin'
console.log(person.age)  // 18
console.log(person.habit) // 'Games'

如返回的是基本類型,盡管構(gòu)造函數(shù)是有返回值的策精,但是也相當(dāng)于沒有返回值進(jìn)行處理。

最終代碼實現(xiàn)

function objectFactory() {
    var obj = new Object()
    var Constructor = [].shift.call(arguments)
    if(typeof Constructor !== 'function') {
        throw new Error('first argument must be a factory function')
    }
    obj.__proto__ = Constructor.prototype
    var ret = Constructor.apply(obj, arguments)
    return typeof ret === 'object' ? ret : obj
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崇棠,一起剝皮案震驚了整個濱河市咽袜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枕稀,老刑警劉巖询刹,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萎坷,居然都是意外死亡凹联,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門哆档,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔽挠,“玉大人,你說我怎么就攤上這事瓜浸“氖纾” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵插佛,是天一觀的道長杠巡。 經(jīng)常有香客問我,道長雇寇,這世上最難降的妖魔是什么氢拥? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮锨侯,結(jié)果婚禮上嫩海,老公的妹妹穿的比我還像新娘。我一直安慰自己囚痴,他們只是感情好出革,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渡讼,像睡著了一般骂束。 火紅的嫁衣襯著肌膚如雪耳璧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天展箱,我揣著相機(jī)與錄音旨枯,去河邊找鬼。 笑死混驰,一個胖子當(dāng)著我的面吹牛攀隔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栖榨,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昆汹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婴栽?” 一聲冷哼從身側(cè)響起满粗,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愚争,沒想到半個月后映皆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轰枝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年捅彻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞍陨。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡步淹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诚撵,到底是詐尸還是另有隱情贤旷,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布砾脑,位于F島的核電站幼驶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏韧衣。R本人自食惡果不足惜盅藻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畅铭。 院中可真熱鬧氏淑,春花似錦、人聲如沸硕噩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辉懒,卻和暖如春阳惹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眶俩。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工莹汤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颠印。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓纲岭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親线罕。 傳聞我的和親對象是個殘疾皇子止潮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354