摘要:命令作用作用是執(zhí)行構(gòu)造函數(shù),返回實(shí)例對(duì)象上面例子是自定義一個(gè)構(gòu)造函數(shù),其最大的特點(diǎn)就是首字母大寫(xiě),用執(zhí)行構(gòu)造函數(shù)其中,在的執(zhí)行下,代表了實(shí)例化后的對(duì)象,這個(gè)也就有屬性注意點(diǎn)如果不用執(zhí)行構(gòu)造函數(shù),那么指向的是全局有兩種方式可以避免內(nèi)部定義嚴(yán)格
new命令 new作用
作用是執(zhí)行構(gòu)造函數(shù),返回實(shí)例對(duì)象
function F() { this.name = "object" } var obj = new F();
上面例子是自定義一個(gè)構(gòu)造函數(shù),其最大的特點(diǎn)就是首字母大寫(xiě),用new執(zhí)行構(gòu)造函數(shù);
其中this,在new的執(zhí)行下,代表了實(shí)例化后的對(duì)象,這個(gè)obj也就有name屬性
注意點(diǎn):如果不用new執(zhí)行構(gòu)造函數(shù),那么this指向的是全局window
function F() { this.name = "object" } var obj = F(); console.log(obj); //undefined console.log(name); //object
有兩種方式可以避免:
內(nèi)部定義嚴(yán)格模式,當(dāng)this為undefined時(shí),添加屬性會(huì)報(bào)錯(cuò)
function F() { this.name = "object" } F(); //TypeError: Cannot set property "name" of undefined
加個(gè)判斷機(jī)制
function F() { if(!(this instanceof F)){ return new F(); } this.name = "object" } F();
用new.target來(lái)判斷,在沒(méi)有用new執(zhí)行時(shí)new.target返回undefined,new執(zhí)行下返回構(gòu)造函數(shù)自身
function F() { if(!new.target){ return new F(); } this.name = "object" } F();
簡(jiǎn)單來(lái)說(shuō):不加new執(zhí)行,this就是window;加了new執(zhí)行,那么this = Object.create(F.prototype),構(gòu)建一個(gè)空對(duì)象,繼承下F的原型
當(dāng)構(gòu)造函數(shù)內(nèi)部有return時(shí),需要分情況執(zhí)行
return的內(nèi)容不是對(duì)象,則忽視,返回的時(shí)this對(duì)象
function F() { this.name = "object" reutrn 123; } var obj = F(); //{name : "object"}
return的內(nèi)容是對(duì)象時(shí),則返回return的對(duì)象,(null除外)
function F() { this.name = "object" reutrn {a : 123}; } var obj = F(); //{a : 123}new的原理
前提是使用了new來(lái)執(zhí)行構(gòu)造函數(shù)
創(chuàng)建一個(gè)空對(duì)象,作為對(duì)象實(shí)例來(lái)返回
將空對(duì)象的原型鏈指向構(gòu)造函數(shù)的prototype
將空對(duì)象賦值給構(gòu)造函數(shù)內(nèi)部的this,(this = Object.create(F.prototype))
執(zhí)行構(gòu)造函數(shù)內(nèi)部代碼,若return沒(méi)有返回新對(duì)象(null除外),則返回this對(duì)象
利用上述原理我們可以簡(jiǎn)單模擬一個(gè)new的函數(shù)
function _new(constructor, params) { //將arguments對(duì)象轉(zhuǎn)為數(shù)組 var args = [].slice.call(arguments); //1.取出參數(shù)中的構(gòu)造函數(shù),2.過(guò)濾args,剩下對(duì)構(gòu)造函數(shù)有用的實(shí)參 var constructor = args.shift(); //構(gòu)建空對(duì)象,并繼承構(gòu)造函數(shù)的原型 var context = Object.create(constructor.prototype); //1.借用構(gòu)造函數(shù),將context空對(duì)象賦給this,2.并args實(shí)參與構(gòu)造函數(shù)參數(shù)一一對(duì)應(yīng)對(duì)其賦值,3.形成完整的this對(duì)象 var result = constructor.apply(context, args); //這個(gè)是處理return返回對(duì)象時(shí)的情況 return (typeof result === "object" && result != null) ? result : context; } function P(n) { var a = 1; this.b = n; //return null; } var p = _new(P,123); console.log(p);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/98173.html
摘要:它不區(qū)分該屬性是對(duì)象自身的屬性,還是繼承的屬性。那么我們要遍歷對(duì)象所有屬性,包括繼承以及不可遍歷的屬性,用加原型遍歷實(shí)現(xiàn)類似的用遞歸 Object靜態(tài)方法 Object自身方法,必須由Object調(diào)用,實(shí)例對(duì)象并不能調(diào)用 Object.getPrototypeOf() 作用是獲取目標(biāo)對(duì)象的原型 function F() {}; var obj = new F(); console.lo...
摘要:原型要掌握這三者之間的關(guān)系,通過(guò)代碼例子記錄一下自身屬性的這里就是通過(guò)代碼看一下做了什么默認(rèn)情況下,將的所有屬性包括繼承的賦值給有什么東西呢自己的原型鏈,添加一個(gè)屬性,用來(lái)指明對(duì)象的誰(shuí)構(gòu)造的自身全部屬性,這邊構(gòu)建一個(gè)空對(duì)象原型,所以沒(méi)有自有 原型 要掌握這三者之間的關(guān)系prototype,constructor,__proto__通過(guò)代碼例子記錄一下 function F() { ...
摘要:繼承是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要的概念,繼承可以使得子類具有父類的屬性和方法或者重新定義追加屬性和方法等。但是在中沒(méi)有類的概念,是基于原型的語(yǔ)言,所以這就意味著對(duì)象可以直接從其他對(duì)象繼承。 繼承是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要的概念,繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等。但是在Javascript中沒(méi)有類的概念,是基于原型的語(yǔ)言,所以這就意味著對(duì)象可以直接...
摘要:原始類型的值只有四種字符串?dāng)?shù)值必須以十進(jìn)制表示布爾值和不能使用和。字符串必須使用雙引號(hào)表示,不能使用單引號(hào)。數(shù)組或?qū)ο笞詈笠粋€(gè)成員的后面,不能加逗號(hào)。 JSON對(duì)象 補(bǔ)充記錄一下,有些方法很需要熟練記憶的 JSON對(duì)象的規(guī)定 JSON對(duì)象對(duì)值有嚴(yán)格的規(guī)定 復(fù)合類型的值只能是數(shù)組或?qū)ο螅荒苁呛瘮?shù)、正則表達(dá)式對(duì)象、日期對(duì)象。原始類型的值只有四種:字符串、數(shù)值(必須以十進(jìn)制表示)、布爾值和...
摘要:在中,除了幾種原始類型外,其余皆為對(duì)象,,既然對(duì)象如此重要,那就列舉一下在中如何創(chuàng)建對(duì)象通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象實(shí)例對(duì)象字面量對(duì)象字面量是對(duì)象定義的一種簡(jiǎn)寫(xiě)形式,目的在于簡(jiǎn)化創(chuàng)建包含大量屬性的對(duì)象的過(guò)程。 在Javascript中,除了幾種原始類型外,其余皆為對(duì)象(Object,Array ...),既然對(duì)象如此重要,那就列舉一下在Javascript中如何創(chuàng)建對(duì)象: 通過(guò)Object構(gòu)造...
閱讀 2938·2023-04-26 02:23
閱讀 1768·2021-11-11 16:55
閱讀 3213·2021-10-19 11:47
閱讀 3450·2021-09-22 15:15
閱讀 2044·2019-08-30 15:55
閱讀 1106·2019-08-29 15:43
閱讀 1361·2019-08-29 13:16
閱讀 2265·2019-08-29 12:38