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


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


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

