手動實現(xiàn)一個new操作

寫在前面

在所有的前端面試中常常喜歡考面試者如何手寫一個new操作符宛蚓,作為在準(zhǔn)備秋招的大三黨,我也要考慮這些喇闸。
那么我們先看看new操作符都干了什么事情蒸眠,有哪些操作漾橙?通過下面的代碼來進行思考:

// 新建一個類(構(gòu)造函數(shù))
function Otaku(name, age) {
    this.name = name;
    this.age = age;
    // 自身的屬性
    this.habit = 'pk';
}
// 給類的原型上添加屬性和方法
Otaku.prototype.strength = 60;
Otaku.prototype.sayYourName = function () {
    console.log('I am ' + this.name);
}
// 實例化一個person對象
const person = new Otaku('喬峰',5000);
person.sayYourName();
console.log(person);//打印出構(gòu)造出來的實例
控制臺打印結(jié)果

解析

從控制臺打印出來的結(jié)果我們可以看出new操作符大概做了一下幾件事情:

  1. 返回(產(chǎn)生)了一個新的對象
  2. 訪問到了類Otaku構(gòu)造函數(shù)里的屬性
  3. 訪問到Otaku原型上的屬性和方法 并且設(shè)置了this的指向(指向新生成的實例對象)

通過上面的分析展示,可以知道new團伙里面一定有Object的參與楞卡,不然對象的產(chǎn)生就有點說不清了霜运。 先來邊寫寫:

// 需要返回一個對象 借助函數(shù)來實現(xiàn)new操作 
// 傳入需要的參數(shù): 類 + 屬性
const person = new Otaku('喬峰',5000);
const person1 = objectFactory(Otaku, '鳩摩智', 5000);

// 開始來實現(xiàn)objectFactory 方法 
function objectFactory(obj, name, age) {}
// 這種方法將自身寫死了 如此他只能構(gòu)造以obj為原型,并且只有name 和 age 屬性的 obj
// 在js中 函數(shù)因為arguments 使得函數(shù)參數(shù)的寫法異常靈活臀晃,在函數(shù)內(nèi)部可以通過arguments來獲得函數(shù)的參數(shù)
function objectFactory() {
    console.log(arguements); //{ '0': [Function: Otaku], '1': '鳩摩智', '2': 5000 }
     // 通過arguments類數(shù)組打印出的結(jié)果觉渴,我們可以看到其中包含了構(gòu)造函數(shù)以及我們調(diào)用objectfactory時傳入的其他參數(shù)
    // 接下來就是要想如何得到其中這個構(gòu)造函數(shù)和其他的參數(shù)
    // 由于arguments是類數(shù)組介劫,沒有直接的方法可以供其使用徽惋,我們可以有以下兩種方法:
    // 1. Array.from(arguments).shift(); //轉(zhuǎn)換成數(shù)組 使用數(shù)組的方法shift將第一項彈出
    // 2.[].shift().call(arguments); // 通過call() 讓arguments能夠借用shift方法
    const Constructor = [].shift.call(arguments);
    const args = arguments;
    // 新建一個空對象 純潔無邪
    let obj = new Object();
    // 接下來的想法 給obj這個新生對象的原型指向它的構(gòu)造函數(shù)的原型  
    // 給構(gòu)造函數(shù)傳入屬性,注意:構(gòu)造函數(shù)的this屬性
    // 參數(shù)傳進Constructor對obj的屬性賦值座韵,this要指向obj對象
    // 在Coustructor內(nèi)部手動指定函數(shù)執(zhí)行時的this 使用call险绘、apply實現(xiàn)
    Constructor.call(obj,...args);
    return obj;
}

  • 上面的代碼注釋太多踢京,剔除注釋以后的代碼:
    function objectFactory() {
        let Constructor = [].shift.call(arguments);
        const obj = new Object();
        obj.__proto__ = Conctructor.prototype;
        Constructor.call(obj,...arguments);
        return obj;
    }
  • 還有另外一種操作:
function myNew(Obj,...args){
  var obj = Object.create(Obj.prototype);//使用指定的原型對象及其屬性去創(chuàng)建一個新的對象
  Obj.apply(obj,args); // 綁定 this 到obj, 設(shè)置 obj 的屬性
  return obj; // 返回實例
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宦棺,隨后出現(xiàn)的幾起案子瓣距,更是在濱河造成了極大的恐慌,老刑警劉巖代咸,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹈丸,死亡現(xiàn)場離奇詭異,居然都是意外死亡呐芥,警方通過查閱死者的電腦和手機逻杖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來思瘟,“玉大人荸百,你說我怎么就攤上這事”豕ィ” “怎么了够话?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長光绕。 經(jīng)常有香客問我女嘲,道長,這世上最難降的妖魔是什么奇钞? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任澡为,我火速辦了婚禮,結(jié)果婚禮上景埃,老公的妹妹穿的比我還像新娘媒至。我一直安慰自己,他們只是感情好谷徙,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布拒啰。 她就那樣靜靜地躺著,像睡著了一般完慧。 火紅的嫁衣襯著肌膚如雪谋旦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天屈尼,我揣著相機與錄音册着,去河邊找鬼。 笑死脾歧,一個胖子當(dāng)著我的面吹牛甲捏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞭执,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼司顿,長吁一口氣:“原來是場噩夢啊……” “哼芒粹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起大溜,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤化漆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钦奋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體座云,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年付材,在試婚紗的時候發(fā)現(xiàn)自己被綠了疙教。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡伞租,死狀恐怖贞谓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葵诈,我是刑警寧澤裸弦,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站作喘,受9級特大地震影響理疙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望潦嘶。 院中可真熱鬧,春花似錦赃梧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锣险,卻和暖如春蹄皱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芯肤。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工巷折, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崖咨。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓锻拘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掩幢。 傳聞我的和親對象是個殘疾皇子逊拍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)际邻,斷路器芯丧,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,385評論 8 265
  • 不懂主觀的自我追尋 宛若時間 睜眼的剎那 靜默透過指尖 執(zhí)筆書下過去的碑銘 若再長幾歲便好 十幾歲的年紀(jì)本不該承受...
    一朵仙葩兒閱讀 218評論 0 2
  • 今年遇到了一個老同學(xué),在寒假的時候世曾。他比我大一歲缨恒,但是他已經(jīng)在北京上大學(xué)了,聽別人說轮听,他以后要當(dāng)空少骗露,也就是空中服...
    攸寧er閱讀 263評論 0 3
  • 文 / 董小琳 你會突然一次性購買很多不同種類的家用電器嗎萧锉? 別急著搖頭,如果你是已婚人士述寡,就肯定有過這種經(jīng)歷柿隙,那...
    職心眼兒閱讀 2,456評論 0 5