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