摘要:中,實例化一個對象,會用到關(guān)鍵字。這里再解釋一下構(gòu)造函數(shù)我們一般把后面的函數(shù)稱為構(gòu)造函數(shù),如,其中就為構(gòu)造函數(shù)第四點的,可能比較難理解。有點需要注意如果構(gòu)造函數(shù)內(nèi)沒有返回值,則默認(rèn)是返回當(dāng)前上下文,要不然就返回任意非原始類型值。
Javascript中,實例化一個對象,會用到new關(guān)鍵字。
經(jīng)常有人會問對于一個函數(shù),什么時候該使用new關(guān)鍵字。
在回答這個問題之前,需要先了解清楚new的本質(zhì),在調(diào)用new Function的時候,new做了什么操作。
先看如下代碼:
// 定義類 類名字是 classA function classA(){ this.name=1; } classA.prototype.show = function(){ alert(this.name); }; // 用new實例化 var b = new classA(); b.show();
var b = new classA();
這句中,new做了以下幾件事情。
1、創(chuàng)建一個新的對象,這個對象的類型是object;
2、查找class的prototype上的所有方法、屬性,復(fù)制一份給創(chuàng)建的Object
3、將構(gòu)造函數(shù)classA內(nèi)部的this指向創(chuàng)建的Object
4、創(chuàng)建的Object的__proto__指向class的prototype
5、執(zhí)行構(gòu)造函數(shù)class
6、返回新創(chuàng)建的對象給變量b
這個流程應(yīng)該比較好理解的。這里再解釋一下:
1、構(gòu)造函數(shù):我們一般把new 后面的函數(shù)稱為構(gòu)造函數(shù),如new classA(),其中classA就為構(gòu)造函數(shù)
2、第四點的__proto__,可能比較難理解。
每個對象都會在其內(nèi)部初始化一個屬性,就是__proto__,可以在chrome中的調(diào)試器里寫個對象查看下。當(dāng)我們訪問一個對象的屬性時,如果這個對象內(nèi)部不存在這個屬性,那么他就會去__proto__里找這個屬性,這個__proto__又會有自己的__proto__,于是就這樣一直找下去,也就是我們平時所說的原型鏈的概念。
當(dāng)我們調(diào)用b.show()時,首先b中沒有show這個屬性,于是,它就需要到它的__proto__中去找,也就是ClassA.prototype,
而我們在上面定義了ClassA.prototype.show=function(){}; 于是,就找到了這個方法。
再用下面的代碼來理解
var b = {} b.__proto__ = ClassA.prototype ClassA.call(b)
最后再用一句話總結(jié):new關(guān)鍵字以ClassA()為模板創(chuàng)建了一個新的對象,它復(fù)制了ClassA構(gòu)造器中的所有成員變量,同時this指向新創(chuàng)建的對象。
有2點需要注意:
1、如果構(gòu)造函數(shù)內(nèi)沒有返回值,則默認(rèn)是返回this(當(dāng)前上下文),要不然就返回任意非原始類型值。
2、如果不用new關(guān)鍵字,如
var b = classA();
則classA值會返回undefined,并且this(執(zhí)行上下文)是window對象。
也就是說如果你不new的話,this指的就是window全局對象了。
如果要理解這點,需要理清楚this的指向。
this的指向:
1、總的來說,this在函數(shù)內(nèi)部使用,用來引用包含函數(shù)的對象,而不是函數(shù)本身。
2、當(dāng)this值的宿主函數(shù)被封裝在另一個函數(shù)的內(nèi)部或在另一個函數(shù)的上下文中被調(diào)用時,this值將永遠(yuǎn)是對head對象的引用(即全局window對象)
3、使用new關(guān)鍵字調(diào)用構(gòu)造函數(shù)時,this引用“即將創(chuàng)建的對象”
如下面代碼:
// 定義類 類名字是 classA function classA(){ this.name=1; } //執(zhí)行classA classA(); //看下name是undefined還是1 name //返回1
看到這里,相信絕大多數(shù)人應(yīng)該都理解了new的用法了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/78447.html
摘要:在文本輸入框中過濾的字段中輸入在列表中查找總時間超過毫秒的定時器函數(shù)。當(dāng)瀏覽器在處理用戶的手勢的情景下,定時器函數(shù)執(zhí)行超過毫秒也會觸發(fā)該消息英文原文如果閱讀中文后還無法理解可以參考英文截圖 原文地址:http://stackoverflow.com/questions/37367200/what-is-the-deferred-long-running-timer-tasks-warn...
摘要:字符串與數(shù)字間的轉(zhuǎn)換結(jié)果結(jié)果結(jié)果結(jié)果注意會把一個類似于的字符串強(qiáng)制轉(zhuǎn)換成判斷是否為有效的數(shù)字某些方法如會返回一個特殊的值請注意第點中的注意此方法不完全適合判斷一個字符串是否是數(shù)字型小數(shù)轉(zhuǎn)整數(shù)結(jié)果四舍五入結(jié)果返回大于的最小整數(shù)結(jié)果返回小于的最 1.字符串與數(shù)字間的轉(zhuǎn)換 var i = 1; var str = i.toString(); //結(jié)果: 1 var str...
摘要:使用調(diào)用函數(shù)時,會自動執(zhí)行以下操作創(chuàng)建一個全新的對象該對象會被執(zhí)行連接該對象會綁定到函數(shù)調(diào)用的若函數(shù)沒有返回其他對象,表達(dá)式中的函數(shù)調(diào)用會自動返回該對象。 使用this可以減少傳入上下文對象,可以隱式傳遞一個對象引用。使API簡潔而復(fù)用,可以自動引用合適的上下文對象。 【要注意的幾個點】 1. this不一定指向自身; 2. this不一定指向函數(shù)作用域(因為作用域無法通過js代碼訪...
摘要:原型繼承基本模式這種是最簡單實現(xiàn)原型繼承的方法,直接把父類的對象賦值給子類構(gòu)造函數(shù)的原型,這樣子類的對象就可以訪問到父類以及父類構(gòu)造函數(shù)的中的屬性。 真正意義上來說Javascript并不是一門面向?qū)ο蟮恼Z言,沒有提供傳統(tǒng)的繼承方式,但是它提供了一種原型繼承的方式,利用自身提供的原型屬性來實現(xiàn)繼承。Javascript原型繼承是一個被說爛掉了的話題,但是自己對于這個問題一直沒有徹底理解...
閱讀 843·2021-11-24 10:44
閱讀 2778·2021-11-11 16:54
閱讀 3159·2021-10-08 10:21
閱讀 2066·2021-08-25 09:39
閱讀 2899·2019-08-30 15:56
閱讀 3459·2019-08-30 13:46
閱讀 3493·2019-08-23 18:09
閱讀 2066·2019-08-23 17:05