原生JS封裝_new函數(shù)實(shí)現(xiàn)new關(guān)鍵字的功能
一.前言
眾所周知:沒有對(duì)象怎么辦?那就new一個(gè)!
那么在JS中,當(dāng)我們new一個(gè)對(duì)象的時(shí)候,這個(gè)new關(guān)鍵字內(nèi)部都干了什么呢?
現(xiàn)在我們就來剖析一下原生JS中new關(guān)鍵字內(nèi)部的工作原理。
二.原始的new
首先,我們先new一個(gè)對(duì)象看看:
//創(chuàng)建Person構(gòu)造函數(shù),參數(shù)為name,age
function Person(name,age){
this.name = name;
this.age = age;
}
//實(shí)例化對(duì)象小明
xm = new Person('xiaoming',18);
//打印實(shí)例化出來的對(duì)象小明
console.log(xm);
打印結(jié)果:


從打印結(jié)果中可以看到:
用new關(guān)鍵字實(shí)例化對(duì)象時(shí),首先創(chuàng)建了一個(gè)空對(duì)象xm,并且這個(gè)空對(duì)象包含兩個(gè)屬性name和age,分別對(duì)應(yīng)構(gòu)造函數(shù)中的兩個(gè)屬性,其次我們也可以知道實(shí)例化出來的這個(gè)對(duì)象xm是繼承自Person.prototype,那么現(xiàn)在我們就可以總結(jié)出new關(guān)鍵字在實(shí)例化對(duì)象時(shí)內(nèi)部都干了什么,其實(shí),new關(guān)鍵字內(nèi)部干了如下三件事(已知構(gòu)造函數(shù)為Func):
1.創(chuàng)建一個(gè)空對(duì)象,并使該空對(duì)象繼承Func.prototype;
2.執(zhí)行構(gòu)造函數(shù),并將this指向剛剛創(chuàng)建的新對(duì)象;
3.返回新對(duì)象;
三.封裝_new函數(shù)
當(dāng)我們知道new關(guān)鍵字的內(nèi)部原理后,我們就可以封裝一個(gè)_new函數(shù),使其用于與new關(guān)鍵字同樣的功能。
_new函數(shù)需要傳入以下幾個(gè)參數(shù):
第一個(gè)參數(shù):構(gòu)造函數(shù)名Func;
第二個(gè)參數(shù)及后面的參數(shù):構(gòu)造函數(shù)的參數(shù)
function _new(){
//1.拿到傳入的參數(shù)中的第一個(gè)參數(shù),即構(gòu)造函數(shù)名Func
var Func = [].shift.call(arguments);
//2.創(chuàng)建一個(gè)空對(duì)象obj,并讓其繼承Func.prototype
var obj = Object.create(Func.prototype);
//3.執(zhí)行構(gòu)造函數(shù),并將this指向創(chuàng)建的空對(duì)象obj
Func.apply(obj,arguments)
//4.返回創(chuàng)建的對(duì)象obj
return obj
}
四.測(cè)試_new函數(shù)
封裝好后,我們來測(cè)試一下封裝的_new函數(shù),看看它是否實(shí)現(xiàn)了和原生new關(guān)鍵字同樣的功能。
//創(chuàng)建Person構(gòu)造函數(shù),參數(shù)為name,age
function Person(name,age){
this.name = name;
this.age = age;
}
function _new(){
//1.拿到傳入的參數(shù)中的第一個(gè)參數(shù),即構(gòu)造函數(shù)名Func
var Func = [].shift.call(arguments);
//2.創(chuàng)建一個(gè)空對(duì)象obj,并讓其繼承Func.prototype
var obj = Object.create(Func.prototype);
//3.執(zhí)行構(gòu)造函數(shù),并將this指向創(chuàng)建的空對(duì)象obj
Func.apply(obj,arguments)
//4.返回創(chuàng)建的對(duì)象obj
return obj
}
xm = _new(Person,'xiaoming',18);
console.log(xm);
測(cè)試結(jié)果:


從測(cè)試結(jié)果看到,_new函數(shù)的功能與new關(guān)鍵字完全一致。
總結(jié)
以上所述是小編給大家介紹的原生JS封裝_new函數(shù)實(shí)現(xiàn)new關(guān)鍵字的功能,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
javascript框架設(shè)計(jì)讀書筆記之模塊加載系統(tǒng)
本文是司徒正美的《javascript框架設(shè)計(jì)》的第二章模塊加載系統(tǒng)的讀書筆記,根據(jù)自己的理解,簡(jiǎn)要的跟大家講述了本章的主要內(nèi)容,方便大家更好的學(xué)習(xí)。2014-12-12
微信小程序?qū)W習(xí)筆記之本地?cái)?shù)據(jù)緩存功能詳解
這篇文章主要介紹了微信小程序?qū)W習(xí)筆記之本地?cái)?shù)據(jù)緩存功能,結(jié)合實(shí)例形式分析了微信小程序wx.setStorage、wx.getStorage以及wx.removeStorage、wx.clearStorage針對(duì)數(shù)據(jù)緩存的存取、刪除等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
uniapp小程序配置tabbar底部導(dǎo)航欄實(shí)戰(zhàn)指南
tabBar如果應(yīng)用是一個(gè)多tab應(yīng)用,可以通過tabBar配置項(xiàng)指定tab欄的表現(xiàn),以及tab切換時(shí)顯示的對(duì)應(yīng)頁(yè),下面這篇文章主要給大家介紹了關(guān)于uniapp小程序配置tabbar底部導(dǎo)航欄的相關(guān)資料,需要的朋友可以參考下2022-09-09
javascript容錯(cuò)處理代碼(屏蔽js錯(cuò)誤)
本文主要介紹了javascript的容錯(cuò)處理代碼。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
微信小程序?qū)崿F(xiàn)的3d輪播圖效果示例【基于swiper組件】
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)的3d輪播圖效果,結(jié)合實(shí)例形式分析了微信小程序基于swiper組件相關(guān)屬性設(shè)置、事件響應(yīng)操作技巧,需要的朋友可以參考下2018-12-12
javascript實(shí)現(xiàn)在網(wǎng)頁(yè)中運(yùn)行本地程序的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)在網(wǎng)頁(yè)中運(yùn)行本地程序的方法,實(shí)例分析了JavaScript基于ActiveXObject運(yùn)行本地程序的技巧,需要的朋友可以參考下2016-02-02
JavaScript實(shí)現(xiàn)九宮格抽獎(jiǎng)
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)九宮格抽獎(jiǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Web性能優(yōu)化系列 10個(gè)提升JavaScript性能的技巧
Javascript 性能優(yōu)化絕不是一種書面的技術(shù),Nicholas 的技術(shù)演進(jìn)列出了10條建議,幫助你寫出高效的 JS 代碼2016-09-09

