电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

JavaScript中實現new的兩種方式引發的探究

瀏覽:2日期:2023-06-03 16:05:03
前言

當你 new 一個構造函數時發生了什么?

“眾所周知”的三步:

創建一個空對象,將它的引用賦給 this,繼承函數的原型;通過 this 將屬性和方法添加至這個對象;最后返回 this 指向的新對象,也就是實例。

一般來說在js中大概是這樣的:

function Mynew(parent,...rest){let obj={};obj.__proto__=parent.prototype;let res=parent.apply(obj,rest);return typeof res=='object'?res:obj;}

上面提到的“空對象”只是簡稱。事實上,就算是定義一個 {} ,它也會從 Object.prototype 上繼承很多方法和屬性。《JavaScript語言精髓與編程實踐》中提出了一個“更加空白的對象”:它有兩種情況 —— Constructor.prototype 值為null;或者Object.getPrototypeOf(obj) 值為null。

但通常我們還能見到另一種寫法:

function Mynew_2(parent,...rest){let child=Object.create(parent.prototype);let result=parent.apply(child,rest);return typeof result=='object'?result:child;}

這兩種實現的不同無疑引起了我的興趣!

Object.create()是怎么實現的?

我們來看一段代碼:

var Best1=function(){this.a=2;}var o1=Object.create(Best1);var o2=Object.create(Best1.prototype);console.log(o1.a); // undefinedconsole.log(o2.a); // undefined

JavaScript中實現new的兩種方式引發的探究

可以看到,以 o1 為例,Object.create() 失去了對原來對象屬性的訪問,而 o2 …同理。

再來看另一段代碼:

var Best=function(){this.a=2;}Best.prototype.a=3;var o1=Object.create(Best);var o2=Object.create(Best.prototype);console.log(o1.a); // undefinedconsole.log(o2.a); // 3

JavaScript中實現new的兩種方式引發的探究

到這里,我似乎明白了什么,又似乎沒明白…

我決定這么做:

let b=new Best();console.log(b);

JavaScript中實現new的兩種方式引發的探究

console.log(Best.prototype);

JavaScript中實現new的兩種方式引發的探究

恍然大悟!

原來我們平時說的 “當讀取實例屬性時,如果找不到,就會查找與對象關聯的原型中的屬性;如果還找不到,就去找原型的原型,直到最頂層(__proto__ 為null)為止” 是指 “一直順著 __proto__ 向上查找”(注意:不經過prototype!)。

那 __proto__ 和 prototype 之間又有什么呢?

console.log(b.__proto__);console.log(Best.prototype);

JavaScript中實現new的兩種方式引發的探究

哦!這就是我們常聽到的“實例的 __proto__ 等于對象的 prototype ”吧。

那現在回過頭來,打印一下 o2 這個對象:

console.log(o2);

JavaScript中實現new的兩種方式引發的探究

你有沒有想到什么?

根據上面所描述的那樣,o2 就是 Best 的實例啊!

所以說,create() 函數實際上返回了一個對象的實例?

但 o1 仍然“不為所動”!

JavaScript中實現new的兩種方式引發的探究

所以我們能否猜測:在 Object.create() 函數中應該是拿到對象的原型并以實例的形式返回:

Object.create=function(o){let F=function(){};F.prototype=o;return new F();}

為什么這里要用函數再 new 的方式?而不是直接用對象去接收?

JavaScript中實現new的兩種方式引發的探究

這和“為什么vue中data是一個函數而不是直接的對象”其實是一個問題:JavaScript中的對象是引用類型,在一個實例中改變某一個元素的值其余實例的值都會發生改變!

而通過create函數則不會:

JavaScript中實現new的兩種方式引發的探究

總結

到此這篇關于JavaScript中實現new的兩種方式的文章就介紹到這了,更多相關JS實現new的方式內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 信阳市建筑勘察设计研究院有限公司 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 模具硅橡胶,人体硅胶,移印硅胶浆厂家-宏图硅胶科技 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | Type-c防水母座|贴片母座|耳机接口|Type-c插座-深圳市步步精科技有限公司 | 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 电脑刺绣_绣花厂家_绣花章仔_织唛厂家-[源欣刺绣]潮牌刺绣打版定制绣花加工厂家 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 定制液氮罐_小型气相液氮罐_自增压液氮罐_班德液氮罐厂家 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 纯水设备_苏州皙全超纯水设备水处理设备生产厂家 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 深圳办公室装修-写字楼装修设计-深圳标榜装饰公司 | 深圳离婚律师咨询「在线免费」华荣深圳婚姻律师事务所专办离婚纠纷案件 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 成都思迪机电技术研究所-四川成都思迪编码器 | 电缆桥架生产厂家_槽式/梯式_热镀锌线槽_广东东莞雷正电气 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | POS机办理_个人POS机免费领取 - 银联POS机申请首页 | 派克防爆伺服电机品牌|国产防爆伺服电机|高低温伺服电机|杭州摩森机电科技有限公司 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 |