摘要:在使用利用面向?qū)ο蟮乃枷雱?chuàng)建類和對象時,通常是使用構(gòu)造函數(shù),工廠方式,原型方式,原型構(gòu)造函數(shù)方式等。
在使用javascript利用面向?qū)ο蟮乃枷雱?chuàng)建類和對象時,通常是使用構(gòu)造函數(shù),工廠方式,原型方式,原型構(gòu)造函數(shù)方式等。
構(gòu)造函數(shù)其實就是使用一個使用new操作符調(diào)用函數(shù),當使用new調(diào)用時,構(gòu)造函數(shù)內(nèi)用到的this對象會指向新創(chuàng)建的對象實例,例如:
function Person(name, age){ this.name = name; this.age = age; } var p1 = new Person("summer", 28)
上述例子Person構(gòu)造函數(shù)使用this對象給兩個屬性賦值:name,age。當使用new操作符新建一個變量p1,即創(chuàng)建了一個新的對象,同時this指向當前的p1對象。
這是利用構(gòu)造函數(shù)創(chuàng)建對象的情況,當不使用new操作符時,將Person當做普通函數(shù)調(diào)用,由于該this對象是在運行時綁定的,所以直接調(diào)用Person(),這時this會映射到全局對象window上這時就污染了全局window對象,例如:
var p1 = Person("summer", 28); console.log(window.age); //28 console.log(p1.age);//報錯
發(fā)現(xiàn)原本針對Person實例的屬性被加到了全局window對象上,構(gòu)造函數(shù)作為普通函數(shù)調(diào)用,由于this對象的晚綁定造成的,這里this被解析成window對象,這樣污染了全局屬性window.name。
為了保證每次的構(gòu)造函數(shù)都創(chuàng)建一個對象,即不允許作為普通函數(shù)調(diào)用,解決方法是創(chuàng)建一個作用域安全的構(gòu)造函數(shù).
首先判斷this對象是正確的類型實例,如果不是,那么就會創(chuàng)建新的實例并且返回該實例對象。
如下所示:
function Person(name, age){ if(this instanceof Person){//判斷this是否指向Person this.name = name; this.age = age; }else{ return new Person(name,age);//返回一個新的對象 } } var p1 = Person("summer", 28); console.log(window.name);//"" console.log(p1.name);//summer
如下所示:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78842.html
摘要:表示沒有對象,即該處不應(yīng)該有值。閉包的形成允許使用內(nèi)部函數(shù),可以將函數(shù)定義和函數(shù)表達式放在另一個函數(shù)的函數(shù)體內(nèi)。使用閉包可以減少全局環(huán)境的污染,也可用延續(xù)變量的生命。所以在閉包不用之后,將不使用的局部變量刪除,使其被回收。 1.javaScript的數(shù)據(jù)類型有什么 Undefined、Null、Boolean、Number、String 2.檢測數(shù)據(jù)類型有什么方法 typeof typ...
摘要:三種使用構(gòu)造函數(shù)創(chuàng)建對象的方法和的作用都是在某個特殊對象的作用域中調(diào)用函數(shù)。這種方式還支持向構(gòu)造函數(shù)傳遞參數(shù)。叫法上把函數(shù)叫做構(gòu)造函數(shù),其他無區(qū)別適用情境可以在特殊的情況下用來為對象創(chuàng)建構(gòu)造函數(shù)。 一、工廠模式 工廠模式:使用字面量和object構(gòu)造函數(shù)會有很多重復(fù)代碼,在此基礎(chǔ)上改進showImg(https://segmentfault.com/img/bVbmKxb?w=456&...
摘要:閉包閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)當某個函數(shù)被調(diào)用時,會創(chuàng)建一個執(zhí)行環(huán)境及相應(yīng)的作用域鏈。要注意通過第句聲明的這個方法屬于構(gòu)造函數(shù)生成的對象,而不屬于構(gòu)造函數(shù)的變量對象,也就是說,并不存在于作用域鏈中。 看到評論里有仁兄建議我試試箭頭函數(shù),真是受寵若驚,本來寫這篇文章也只是想記錄寫要點給自己日后看的。今天早上看到一篇總結(jié)javascript中this的文章JavaScr...
摘要:此時的作用域鏈包含了兩個對象的活動對象和對象。閉包的應(yīng)用場景保護函數(shù)內(nèi)的變量安全。依然如前例,由于閉包,函數(shù)中的一直存在于內(nèi)存中,因此每次執(zhí)行,都會給自加。 引子 JS的閉包一直是很多人不理解,也是在使用過程中經(jīng)常出現(xiàn)問題的地方。每次看文章都會有所了解閉包,但是,用起來還是不對,而且錯誤百出,其關(guān)鍵問題還是出在對其不理解,不了解。此文章會不定期更新以及完善,希望在我學習的時候,讓大家也...
摘要:前端基本功常見概念一點這里前端基本功常見概念二點這里前端基本功常見概念三點這里什么是原型鏈當一個引用類型繼承另一個引用類型的屬性和方法時候就會產(chǎn)生一個原型鏈。函數(shù)式編程是聲明式而不是命令式,并且應(yīng)用程序狀態(tài)通過純函數(shù)流轉(zhuǎn)。 前端基本功-常見概念(一) 點這里前端基本功-常見概念(二) 點這里前端基本功-常見概念(三) 點這里 1.什么是原型鏈 當一個引用類型繼承另一個引用類型的屬性和方...
閱讀 937·2023-04-26 01:34
閱讀 3371·2023-04-25 20:58
閱讀 3324·2021-11-08 13:22
閱讀 2126·2019-08-30 14:17
閱讀 2537·2019-08-29 15:27
閱讀 2687·2019-08-29 12:45
閱讀 3011·2019-08-29 12:26
閱讀 2824·2019-08-28 17:51