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

您的位置:首頁技術文章
文章詳情頁

Javascript模擬實現new原理解析

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

new是JS中的一個關鍵字,用來將構造函數實例化的一個運算符。例子:

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

從上面的例子可以得出兩點結論:

new操作符實例化了一個對象; 這個對象可以訪問構造函數的屬性; 這個對象可以訪問構造函數原型上的屬性; 對象的**__proto__**屬性指向了構造函數的原型;

由于new是關鍵字,我們只能去聲明一個函數去實現new的功能,首先實現上面的三個特性,第一版代碼如下:

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

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

我們測試下:

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的特性實現已經80%,但new還有一個特性:

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

如上,如果構造函數return了一個對象,那么new操作后返回的是構造函數return的對象。讓我們來實現下這個特性,最終版代碼如下:

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

測試下:

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

以上代碼就是我們最終對new操作符的模擬實現。我們再來看下官方對new的解釋

引用MDN對new運算符的定義:

new 運算符創建一個用戶定義的對象類型的實例或具有構造函數的內置對象的實例。

new操作符會干下面這些事:

創建一個空的簡單JavaScript對象(即{}); 鏈接該對象(即設置該對象的構造函數)到另一個對象 ; 將步驟1新創建的對象作為this的上下文 ; 如果該函數沒有返回對象,則返回this。

4條都已經實現。還有一個更好的實現,就是通過Object.create去創建一個空的對象:

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩久久精品| 亚洲二区三区不卡| 国产精品7m凸凹视频分类| 亚洲一区二区日韩| 欧美天堂亚洲电影院在线观看| 成人高清一区| 精品视频网站| 美女av在线免费看| 99久久亚洲精品| 久久亚洲专区| 免费成人在线视频观看| 久久精品国产68国产精品亚洲| 国产精品一区二区av日韩在线 | 亚洲一区欧美| 国产手机视频一区二区| 国产精品久久久久9999高清| 中文字幕成人| 五月激激激综合网色播| 日本亚洲最大的色成网站www| 国产麻豆一区二区三区精品视频| 欧美视频二区| 伊人久久一区| 国产亚洲久久| 免费看日韩精品| 日本91福利区| 日韩国产高清在线| 亚洲黄色中文字幕| 亚洲人成在线影院| 欧美一区成人| 欧美1区二区| 国产精品久久久免费| 日韩精品一级中文字幕精品视频免费观看 | 久久精品国产99| 免费日韩成人| 国产 日韩 欧美 综合 一区| 亚洲免费一区二区| 日本不卡高清| 国产精品红桃| 日韩高清中文字幕一区二区| 亚洲精品极品少妇16p| 日本中文字幕视频一区| 国产一区二区三区亚洲| 日韩区一区二| 日韩不卡一二三区| 在线国产一区二区| 三级欧美韩日大片在线看| 麻豆精品在线播放| 国产精品传媒麻豆hd| 日韩av影院| 亚洲久久一区| 日本精品国产| 日韩1区2区3区| 国产日韩在线观看视频| 精品国产一区二区三区2021| 激情婷婷亚洲| 久久精品超碰| 欧美色图一区| 国产调教精品| 免费久久久久久久久| 亚州欧美在线| av最新在线| 亚洲人亚洲人色久| 欧美日韩在线播放视频| 久久国产精品免费一区二区三区 | 91综合视频| 少妇精品久久久一区二区| 亚洲电影有码| 国产美女撒尿一区二区| 午夜欧美精品| 精品欠久久久中文字幕加勒比| 亚洲一区网站| 日韩伦理在线一区| 日本综合视频| 国产在线|日韩| 久久av网站| 日韩一区二区三区在线看| 久久久一本精品| 欧美国产先锋| 亚洲精品一级二级三级| 久久九九电影| 麻豆国产精品| 中文字幕亚洲精品乱码| 91精品精品| 成人精品高清在线视频| 日韩av午夜在线观看| 国产婷婷精品| 激情综合激情| 免费在线成人| 日韩va欧美va亚洲va久久| 日韩视频久久| 色婷婷久久久| 成人欧美一区二区三区的电影| 国产视频亚洲| 欧美国产亚洲精品| 日韩精品免费视频人成| 日韩欧美自拍| 日本高清久久| 亚洲一区区二区| 国产一区导航| 激情综合网址| 亚洲成人精品| 国产精品久久久久久久久久妞妞| 久久精品1区| 婷婷综合五月| 鲁鲁在线中文| 麻豆精品少妇| 国产欧美激情| 日韩成人一级| 综合一区二区三区| 久久电影一区| 欧美日韩中文字幕一区二区三区| 成人在线视频免费看| 国产精品亚洲综合色区韩国| 亚洲精品动态| 亚洲免费中文| 99视频精品| 亚洲精品一区二区妖精| 国产精品天天看天天狠| 日韩国产成人精品| 日韩高清在线一区| 欧美日韩精品一区二区三区视频 | 超级白嫩亚洲国产第一| 麻豆91精品视频| 国产日韩一区二区三免费高清| 日本一区福利在线| 亚洲一区二区成人| 亚洲女人av| 免费观看久久久4p| 亚洲天堂av资源在线观看| 亚洲视频国产精品| 色综合视频一区二区三区日韩 | 国产精品久久久久av蜜臀| 蜜臀va亚洲va欧美va天堂| 久久精品福利| 国产一区亚洲| 欧美亚洲国产激情| 亚洲高清影视| 噜噜噜躁狠狠躁狠狠精品视频| 视频一区在线播放| 中文字幕免费一区二区| 日韩精品视频一区二区三区| 亚洲精品动态| 美女尤物久久精品| 久久99伊人| 7777精品| 成人精品国产亚洲| 国产99亚洲| 久久大逼视频| 日本a级不卡| 精品国产一级| 久久亚洲国产| 亚洲毛片视频| 欧美激情视频一区二区三区在线播放| 久久久亚洲欧洲日产| 色综合五月天| 日韩一区二区在线免费| 性欧美xxxx免费岛国不卡电影| 午夜国产一区二区| 亚洲深深色噜噜狠狠爱网站| 日韩精品视频一区二区三区| 国产精品极品| 久久精品国产68国产精品亚洲| 午夜在线视频观看日韩17c| 日韩精品中文字幕吗一区二区| 欧美激情麻豆| 99久久九九| 日韩精品视频中文字幕| 精品一区二区三区视频在线播放| 色天使综合视频| 蜜桃视频第一区免费观看| 欧美另类中文字幕| 亚洲另类av| 精品国产aⅴ| 成人午夜网址| 欧美日韩日本国产亚洲在线 | 麻豆久久一区| 天堂成人国产精品一区| 中文在线资源| 国产99亚洲| 日韩免费精品| а√天堂中文在线资源8| 精品中文字幕一区二区三区av| 亚洲一级淫片| 久久精品资源| 日韩免费久久| 日本亚洲视频| 日本高清不卡一区二区三区视频 | 99视频精品| 美女高潮久久久| 国产精品呻吟| 国产成人精品999在线观看| 亚洲在线网站| 丰满少妇一区| 中文在线日韩| 亚洲精品国产嫩草在线观看 | 欧美99久久| 久久99蜜桃| 久久亚洲国产精品一区二区| 国产一区二区三区四区五区传媒| 亚洲精品第一|