最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年05月13日 11:05:34   作者:恪愚  
眾所周知JS中new的作用是通過構(gòu)造函數(shù)來創(chuàng)建一個實例對象,這篇文章主要給大家介紹了關于JavaScript中實現(xiàn)new的兩種方式引發(fā)的相關資料,需要的朋友們下面隨著小編來一起學習學習吧

前言

當你 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); // undefined
console.log(o2.a); // undefined

test1

可以看到,以 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); // undefined
console.log(o2.a); // 3

test2

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

我決定這么做:

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

test3

console.log(Best.prototype);

test4

恍然大悟!

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

!__proto__prototype 之間又有什么呢?

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

test5

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

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

console.log(o2);

test6

你有沒有想到什么?

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

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

但 o1 仍然“不為所動”!

test7

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

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

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

test8

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

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

test8

總結(jié)

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

相關文章

  • Extjs顯示從數(shù)據(jù)庫取出時間轉(zhuǎn)換JSON后的出現(xiàn)問題

    Extjs顯示從數(shù)據(jù)庫取出時間轉(zhuǎn)換JSON后的出現(xiàn)問題

    后臺從數(shù)據(jù)庫取出時間,JSON格式化后再傳到gridpanel,這時時間變成了:/Date(32331121223)/這樣的格式,本文將詳細介紹解決Extjs顯示從數(shù)據(jù)庫取出時間轉(zhuǎn)換JSON后的出現(xiàn)問題
    2012-11-11
  • javascript動態(tài)加載二

    javascript動態(tài)加載二

    經(jīng)過一番思考,到底怎么解決導包而且是異步的方式,最后得出一個解決方案。先來看一下采用這個方案后的編程方式
    2012-08-08
  • 梳理總結(jié)25個JavaScript數(shù)組操作方法實例

    梳理總結(jié)25個JavaScript數(shù)組操作方法實例

    這篇文章主要分享JavaScript數(shù)組操作方法實例梳理總結(jié),刪除數(shù)組重復項、獲取數(shù)組的片段等方法,需要的小伙伴可以參考一下
    2022-06-06
  • JavaScript錯誤處理避坑指南

    JavaScript錯誤處理避坑指南

    JavaScript錯誤處理是編程過程中不可避免的部分,它涉及到識別、捕獲和響應代碼運行時可能出現(xiàn)的問題,本文將詳細給大家介紹一下JavaScript錯誤處理的避坑指南,需要的朋友可以參考下
    2025-03-03
  • JS原生帶小白點輪播圖實例講解

    JS原生帶小白點輪播圖實例講解

    下面小編就為大家?guī)硪黄狫S原生帶小白點輪播圖實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • JS+DIV實現(xiàn)鼠標劃過切換層效果的實例代碼

    JS+DIV實現(xiàn)鼠標劃過切換層效果的實例代碼

    這篇文章主要是對JS+DIV實現(xiàn)鼠標劃過切換層效果的實例代碼進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • javascript實現(xiàn)倒計時跳轉(zhuǎn)頁面

    javascript實現(xiàn)倒計時跳轉(zhuǎn)頁面

    本文給大家介紹了如何使用javascript實現(xiàn)倒計時跳轉(zhuǎn)到其他頁面的方法以及實現(xiàn)原理,非常的簡單實用,有需要的小伙伴可以參考下。
    2016-01-01
  • 從JavaScript純函數(shù)解析最深刻的函子 Monad實例

    從JavaScript純函數(shù)解析最深刻的函子 Monad實例

    這篇文章主要為大家介紹了從JavaScript純函數(shù)解析最深刻的函子 Monad實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 原生js頁面滾動延遲加載圖片

    原生js頁面滾動延遲加載圖片

    這篇文章主要介紹了原生js頁面滾動延遲加載圖片的相關資料,現(xiàn)在瀑布流效果大行其道,各種網(wǎng)站都有應用,尤其是專業(yè)的圖片類型的網(wǎng)站,感興趣的朋友可以參考下
    2015-12-12
  • 深入理解requireJS-實現(xiàn)一個簡單的模塊加載器

    深入理解requireJS-實現(xiàn)一個簡單的模塊加載器

    本篇文章主要介紹了深入理解requireJS-實現(xiàn)一個簡單的模塊加載器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論

禄丰县| 福清市| 郸城县| 平顶山市| 林芝县| 竹北市| 泽普县| 苏尼特左旗| 城固县| 南靖县| 乐业县| 宝清县| 和平县| 盱眙县| 九江县| 定西市| 巴林左旗| 南部县| 高雄县| 丁青县| 南陵县| 茂名市| 宜君县| 通渭县| 郯城县| 当阳市| 确山县| 宁波市| 福海县| 林周县| 小金县| 凤凰县| 夏邑县| 孝义市| 修水县| 神木县| 孝昌县| 从江县| 洞头县| 开平市| 定日县|