国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

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

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

“眾所周知”的三步:

創(chuàng)建一個空對象,將它的引用賦給 this,繼承函數(shù)的原型;通過 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;}

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

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

我們來看一段代碼:

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

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

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

我決定這么做:

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

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

console.log(Best.prototype);

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

恍然大悟!

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

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

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

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

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

那現(xiàn)在回過頭來,打印一下 o2 這個對象:

console.log(o2);

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

你有沒有想到什么?

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

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

但 o1 仍然“不為所動”!

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

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

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

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

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

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

而通過create函數(shù)則不會:

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

總結(jié)

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

標簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 国产精品亚洲片在线观看不卡 | 成人a毛片高清视频 | 免费人成观看在线网 | 草视频在线观看 | 国产成人香蕉久久久久 | 三级视频在线 | 国产精品久久久久久久午夜片 | 永久黄网站色视频免费观看99 | 久久国产一区二区三区 | 91精品国产高清久久久久 | 国产日韩高清一区二区三区 | 日韩不卡一区二区三区 | 免费高清特级毛片 | 免费在线成人网 | 日韩毛毛片| 米奇精品一区二区三区在线观看 | 精品色综合 | 中文字幕在线视频精品 | 欧美日本一区亚洲欧美一区 | 秘书高跟黑色丝袜国产91在线 | 久久99久久精品久久久久久 | 亚洲国产精品一区二区久 | 完整日本特级毛片 | 久草综合视频在线 | 久久精品成人一区二区三区 | 国产三级高清 | 亚洲一区二区三区久久精品 | 国产精品99r8免费视频2022 | 欧美一区二区视频在线观看 | 欧美视频xxxxx | 国产真实乱子伦精品 | 亚洲视频日韩 | 亚洲国产韩国一区二区 | 欧美一级特黄特黄做受 | 亚洲一区中文字幕在线 | 午夜影院h| 美女黄页网站免费进入 | 秋霞手机入口二日韩区 | 久草在现 | 欧美成年| 国产成人综合洲欧美在线 |