日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Javascript模擬實(shí)現(xiàn)new原理解析

瀏覽:232日期:2023-11-09 11:21:09

new是JS中的一個(gè)關(guān)鍵字,用來將構(gòu)造函數(shù)實(shí)例化的一個(gè)運(yùn)算符。例子:

function Animal(name) { this.name = name;}Animal.prototype.sayName = function() { console.log('I’m ' + this.name);}var cat = new Animal(’Tom’);console.log(cat.name); // Tomconsole.log(cat.__proto__ === Animal.prototype); // truecat.sayName(); // I’m Tom

從上面的例子可以得出兩點(diǎn)結(jié)論:

new操作符實(shí)例化了一個(gè)對(duì)象; 這個(gè)對(duì)象可以訪問構(gòu)造函數(shù)的屬性; 這個(gè)對(duì)象可以訪問構(gòu)造函數(shù)原型上的屬性; 對(duì)象的**__proto__**屬性指向了構(gòu)造函數(shù)的原型;

由于new是關(guān)鍵字,我們只能去聲明一個(gè)函數(shù)去實(shí)現(xiàn)new的功能,首先實(shí)現(xiàn)上面的三個(gè)特性,第一版代碼如下:

附:對(duì)原型原型鏈不熟悉的可以先看理解Javascript的原型和原型鏈。

// construct: 構(gòu)造函數(shù)function newFunction() { var res = {}; // 排除第一個(gè)構(gòu)造函數(shù)參數(shù) var construct = Array.prototype.shift.call(arguments); res.__proto__ = construct.prototype; // 使用apply執(zhí)行構(gòu)造函數(shù),將構(gòu)造函數(shù)的屬性掛載在res上面 construct.apply(res, arguments); return res;}

我們測(cè)試下:

function newFunction() { var res = {}; var construct = Array.prototype.shift.call(arguments); res.__proto__ = construct.prototype; construct.apply(res, arguments); return res;}function Animal(name) { this.name = name;}Animal.prototype.sayName = function() { console.log('I’m ' + this.name);}var cat = newFunction(Animal, ’Tom’);console.log(cat.name); // Tomconsole.log(cat.__proto__ === Animal.prototype); // truecat.sayName(); // I’m Tom

一切正常。new的特性實(shí)現(xiàn)已經(jīng)80%,但new還有一個(gè)特性:

function Animal(name) { this.name = name; return { prop: ’test’ };}var cat = new Animal(’Tom’);console.log(cat.prop); // testconsole.log(cat.name); // undefinedconsole.log(cat.__proto__ === Object.prototype); // trueconsole.log(cat.__proto__ === Animal.prototype); // false

如上,如果構(gòu)造函數(shù)return了一個(gè)對(duì)象,那么new操作后返回的是構(gòu)造函數(shù)return的對(duì)象。讓我們來實(shí)現(xiàn)下這個(gè)特性,最終版代碼如下:

// construct: 構(gòu)造函數(shù)function newFunction() { var res = {}; // 排除第一個(gè)構(gòu)造函數(shù)參數(shù) var construct = Array.prototype.shift.call(arguments); res.__proto__ = construct.prototype; // 使用apply執(zhí)行構(gòu)造函數(shù),將構(gòu)造函數(shù)的屬性掛載在res上面 var conRes = construct.apply(res, arguments); // 判斷返回類型 return conRes instanceof Object ? conRes : res;}

測(cè)試下:

function Animal(name) { this.name = name; return { prop: ’test’ };}var cat = newFunction(Animal, ’Tom’);console.log(cat.prop); // testconsole.log(cat.name); // undefinedconsole.log(cat.__proto__ === Object.prototype); // trueconsole.log(cat.__proto__ === Animal.prototype); // false

以上代碼就是我們最終對(duì)new操作符的模擬實(shí)現(xiàn)。我們?cè)賮砜聪鹿俜綄?duì)new的解釋

引用MDN對(duì)new運(yùn)算符的定義:

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

new操作符會(huì)干下面這些事:

創(chuàng)建一個(gè)空的簡(jiǎn)單JavaScript對(duì)象(即{}); 鏈接該對(duì)象(即設(shè)置該對(duì)象的構(gòu)造函數(shù))到另一個(gè)對(duì)象 ; 將步驟1新創(chuàng)建的對(duì)象作為this的上下文 ; 如果該函數(shù)沒有返回對(duì)象,則返回this。

4條都已經(jīng)實(shí)現(xiàn)。還有一個(gè)更好的實(shí)現(xiàn),就是通過Object.create去創(chuàng)建一個(gè)空的對(duì)象:

// construct: 構(gòu)造函數(shù)function newFunction() { // 通過Object.create創(chuàng)建一個(gè)空對(duì)象; var res = Object.create(null); // 排除第一個(gè)構(gòu)造函數(shù)參數(shù) var construct = Array.prototype.shift.call(arguments); res.__proto__ = construct.prototype; // 使用apply執(zhí)行構(gòu)造函數(shù),將構(gòu)造函數(shù)的屬性掛載在res上面 var conRes = construct.apply(res, arguments); // 判斷返回類型 return conRes instanceof Object ? conRes : res;}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本三级亚洲精品| 久久精品国产99国产| 91亚洲精品视频在线观看 | 午夜av一区| 日韩激情av在线| 99国产精品99久久久久久粉嫩| 国产中文欧美日韩在线| 美女尤物国产一区| 国产中文欧美日韩在线| 国产欧美69| 国产精品午夜av| 国产乱码精品一区二区三区亚洲人| 亚洲欧洲日韩| 国产人成精品一区二区三| 日韩高清在线不卡| 国产麻豆精品| 丁香婷婷久久| 精品日韩毛片| 亚洲一区二区三区四区电影 | 亚洲午夜在线| 久久久夜夜夜| 免费不卡中文字幕在线| 视频精品一区二区| 国产情侣一区| 欧美成人精品三级网站| 亚洲一区国产一区| 日本久久一区| 精品中文在线| 国产精品字幕| 日韩综合小视频| 黑森林国产精品av| 天堂中文在线播放| 亚洲欧美视频| 国产精品久久久久av蜜臀 | 亚洲涩涩av| 美女视频网站久久| 91亚洲一区| 亚洲天堂免费| 麻豆国产欧美日韩综合精品二区| 日韩精品首页| 日韩高清在线不卡| 综合日韩av| 美女精品网站| 国产激情综合| 在线亚洲自拍| 国产亚洲欧美日韩精品一区二区三区| 精品国产aⅴ| 免费欧美在线视频| 日韩成人三级| 国产毛片精品久久| 亚洲男女自偷自拍| 成人在线视频免费看| 亚洲精品九九| 欧美日韩第一| 精品国产乱码久久久久久樱花| 国产精品毛片| 精品捆绑调教一区二区三区 | 国产99精品| 国产欧美一区二区三区米奇| 欧美日韩国产综合网| 欧美日韩免费观看视频| 久久精品福利| 国产精久久一区二区| 97久久亚洲| 免费日韩精品中文字幕视频在线| 国产粉嫩在线观看| 久久av超碰| 国产精品22p| 国产精品天天看天天狠| 欧美中文一区| 蜜臀va亚洲va欧美va天堂| 91精品精品| 91综合视频| 国产成人精品一区二区三区免费| 麻豆精品99| 精品久久99| 日韩中文在线播放| 久久久久蜜桃| 黄色在线一区| 免费日韩av片| 日韩高清二区| 久久麻豆视频| 毛片在线网站| 亚洲精品一区二区在线看| 黄色日韩在线| 亚洲综合图色| 欧美在线黄色| 日本亚洲最大的色成网站www| 久久国产精品亚洲77777| 亚洲精品高潮| 久久精品日韩欧美| yellow在线观看网址| 91精品国产调教在线观看| 免费日韩视频| 国产精品久久久久久久久久妞妞| 久久久久伊人| 好看不卡的中文字幕| 日韩高清一区在线| 四季av一区二区凹凸精品| 成人日韩在线观看| 在线国产精品一区| 精品视频黄色| 国产一区久久| 国产日韩欧美一区二区三区| 国产传媒av在线| 日本一区二区三区视频在线看 | av资源中文在线天堂| 日韩中文字幕亚洲一区二区va在线 | 国产精品精品| 天海翼亚洲一区二区三区| 日韩一区二区三区高清在线观看| 国产一区二区三区网| 亚洲精一区二区三区| 桃色一区二区| 久久激五月天综合精品| 欧美日韩在线观看视频小说| 日本99精品| 久久午夜视频| 色爱av综合网| 欧美精品第一区| 日韩综合一区二区三区| 欧美成人综合| 日韩不卡在线| 精品国产免费人成网站| 国产精品99久久免费| 合欧美一区二区三区| 亚洲精品国产嫩草在线观看 | 国产一区调教| 久久国际精品| 久久激五月天综合精品| 中文字幕视频精品一区二区三区| 久久人人99| 成人精品亚洲| 亚洲高清不卡| 图片区亚洲欧美小说区| 国产综合亚洲精品一区二| 精品丝袜久久| 国内精品伊人| 色在线中文字幕| 日韩毛片视频| 欧美不卡高清| 午夜在线播放视频欧美| 三级欧美韩日大片在线看| 91精品福利观看| 精品国产a一区二区三区v免费| 蜜臀av国产精品久久久久| 亚洲一区欧美二区| 日韩成人精品一区二区三区 | 黄色欧美在线| 99精品视频精品精品视频| 中文字幕在线看片| 红桃视频国产精品| 亚洲五月综合| 国产精品多人| 久久国产免费| 一区二区电影| 国产精品亚洲产品| 亚洲一级黄色| 91精品福利观看| 日韩在线观看中文字幕| 日本在线高清| 亚洲v天堂v手机在线| 国产一区二区三区不卡视频网站| 国产精品亚洲综合在线观看| 日本精品影院| 日韩欧美中文在线观看| 风间由美中文字幕在线看视频国产欧美| 欧美日一区二区| 国产精品激情电影| 欧美精品一二| 麻豆精品蜜桃视频网站| 亚洲激情二区| 免费福利视频一区二区三区| 最新亚洲国产| 欧美精品一区二区久久| 久久一区国产| 亚洲精品韩国| 亚洲黄色在线| 三上悠亚国产精品一区二区三区| 在线观看一区| 99在线精品免费视频九九视| 国产精选在线| 国产精品欧美在线观看| 久久亚洲美女| 亚洲高清激情| 香蕉视频亚洲一级| 免费福利视频一区二区三区| 毛片不卡一区二区| 欧美精品三级在线| 亚洲日韩中文字幕一区| 午夜在线视频观看日韩17c| 久久婷婷国产| 欧美一区激情| 日韩1区2区3区| 美国三级日本三级久久99 | 亚洲精品国产嫩草在线观看| 国产欧美三级| 国产精一区二区| 国产精品中文字幕亚洲欧美| 日本一区中文字幕|