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