av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

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

JavaScript中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

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

當(dāng)你 new 一個(gè)構(gòu)造函數(shù)時(shí)發(fā)生了什么?

“眾所周知”的三步:

創(chuàng)建一個(gè)空對(duì)象,將它的引用賦給 this,繼承函數(shù)的原型;通過(guò) this 將屬性和方法添加至這個(gè)對(duì)象;最后返回 this 指向的新對(duì)象,也就是實(shí)例。

一般來(lái)說(shuō)在js中大概是這樣的:

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

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

但通常我們還能見(jiàn)到另一種寫(xiě)法:

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

這兩種實(shí)現(xiàn)的不同無(wú)疑引起了我的興趣!

Object.create()是怎么實(shí)現(xiàn)的?

我們來(lái)看一段代碼:

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中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

可以看到,以 o1 為例,Object.create() 失去了對(duì)原來(lái)對(duì)象屬性的訪問(wèn),而 o2 …同理。

再來(lái)看另一段代碼:

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中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

到這里,我似乎明白了什么,又似乎沒(méi)明白…

我決定這么做:

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

JavaScript中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

console.log(Best.prototype);

JavaScript中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

恍然大悟!

原來(lái)我們平時(shí)說(shuō)的 “當(dāng)讀取實(shí)例屬性時(shí),如果找不到,就會(huì)查找與對(duì)象關(guān)聯(lián)的原型中的屬性;如果還找不到,就去找原型的原型,直到最頂層(__proto__ 為null)為止” 是指 “一直順著 __proto__ 向上查找”(注意:不經(jīng)過(guò)prototype?。?。

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

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

JavaScript中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

哦!這就是我們常聽(tīng)到的“實(shí)例的 __proto__ 等于對(duì)象的 prototype ”吧。

那現(xiàn)在回過(guò)頭來(lái),打印一下 o2 這個(gè)對(duì)象:

console.log(o2);

JavaScript中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

你有沒(méi)有想到什么?

根據(jù)上面所描述的那樣,o2 就是 Best 的實(shí)例?。?/p>

所以說(shuō),create() 函數(shù)實(shí)際上返回了一個(gè)對(duì)象的實(shí)例?

但 o1 仍然“不為所動(dòng)”!

JavaScript中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

所以我們能否猜測(cè):在 Object.create() 函數(shù)中應(yīng)該是拿到對(duì)象的原型并以實(shí)例的形式返回:

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

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

JavaScript中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

這和“為什么vue中data是一個(gè)函數(shù)而不是直接的對(duì)象”其實(shí)是一個(gè)問(wèn)題:JavaScript中的對(duì)象是引用類型,在一個(gè)實(shí)例中改變某一個(gè)元素的值其余實(shí)例的值都會(huì)發(fā)生改變!

而通過(guò)create函數(shù)則不會(huì):

JavaScript中實(shí)現(xiàn)new的兩種方式引發(fā)的探究

總結(jié)

到此這篇關(guān)于JavaScript中實(shí)現(xiàn)new的兩種方式的文章就介紹到這了,更多相關(guān)JS實(shí)現(xiàn)new的方式內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 中文字幕日韩在线观看 | 三级黄色片网站 | 国产精品久久久久久久免费看 | 午夜视频在线免费观看 | 国产成人在线观看免费网站 | 成人激情综合网 | 99国产精品99久久久久久粉嫩 | 亚洲国产欧美在线 | 欧美夜夜操 | 久久久婷婷 | 国产又粗又猛视频免费 | 久久久免费看 | 国产免费成人 | 国产成人免费视频 | 中文字幕在线一区二区三区 | 日韩欧美中文在线 | 午夜理伦三级理论 | 久久久中文字幕 | 国产99在线 | 色爱av| 国产区视频 | 色综合久久天天综合网 | 久久av红桃一区二区小说 | 精品一区二区三区免费 | 日韩精品视频在线 | 欧美日韩性 | 91欧美日韩 | 激情另类小说 | 国产一二区 | 国产一级视频在线观看 | 日韩不卡在线观看 | 91免费网站入口 | 日韩欧美国产高清91 | 九色精品 | 天天射天天干天天操 | 亚洲狠狠干 | 日韩黄色免费视频 | av网址在线 | 亚洲女优在线 | 欧美成人一区二区 | 欧美黄网站 |