JS中構(gòu)造函數(shù)的基本特性與優(yōu)缺點(diǎn)
構(gòu)造函數(shù):如用函數(shù)用來初始化(使用new運(yùn)算符)一個(gè)新建的對(duì)象,我們稱之為構(gòu)造函數(shù)(constructor)
function Person(){ this.name = "zqq"; this.age = 28; } var p = new Person();
當(dāng)以new調(diào)用構(gòu)造函數(shù)(執(zhí)行var p = new Person())時(shí),函數(shù)內(nèi)部會(huì)發(fā)生以下情況:
1.創(chuàng)建一個(gè)空對(duì)象
var p = {};
2.this變量指向?qū)ο髉
Person.call(p)
3.p繼承了構(gòu)造函數(shù)Person()的原型
p.__proto__ = Person.prototype
4.執(zhí)行構(gòu)造函數(shù)Person()內(nèi)的代碼
構(gòu)造函數(shù)和普通函數(shù)的區(qū)別:
1.構(gòu)造函數(shù)使用new關(guān)鍵字調(diào)用;普通函數(shù)不用new關(guān)鍵字調(diào)用;
var p = new Person(); var p = Person();
2.構(gòu)造函數(shù)內(nèi)部可以使用this關(guān)鍵字;普通函數(shù)內(nèi)部不建議使用this,因?yàn)檫@時(shí)候this指向的是window全局對(duì)象,這樣無意間就會(huì)為window添加了一些全局變量或函數(shù)
在構(gòu)造函數(shù)內(nèi)部,this指向的是構(gòu)造出來的新對(duì)象
在普通函數(shù)內(nèi)部,this指向的是window全局對(duì)象
3.構(gòu)造函數(shù)默認(rèn)不用return返回值;普通函數(shù)一般都有return返回值
構(gòu)造函數(shù)會(huì)默認(rèn)返回this,也就是新的實(shí)例對(duì)象
普通函數(shù)如果沒有return值的話,返回undefined
如果使用了return,那返回值會(huì)根據(jù)return值的類型而有所不同
return的是五種簡單數(shù)據(jù)類型:String,Number,Boolean,Null,Undefined的話,構(gòu)造函數(shù)會(huì)忽略return的值,依然返回this對(duì)象;而普通函數(shù)會(huì)返回return后面的值 function Person(){ var a; this.name = "zqq"; this.age = 28; return a; } var p = new Person();//返回this對(duì)象 var p = Person();//因?yàn)閍沒初始化,所以a是undefined,而undefined屬于簡單數(shù)據(jù)類型,所以返回undefined,String,Number,Boolean,Null同理 如果return的是引用類型:Array,Date,Object,Function,RegExp,Error的話,構(gòu)造函數(shù)和普通函數(shù)都會(huì)返回return后面的值 function Person(){ var arr = []; this.name = "zqq"; this.age = 28; return arr; } var p = new Person();//返回arr空數(shù)組,Date,Object,Function,RegExp,Error同理 var p1 = new Person();//返回arr空數(shù)組,Date,Object,Function,RegExp,Error同理
4.構(gòu)造函數(shù)首字母建議大寫;普通函數(shù)首字母建議小寫
構(gòu)造函數(shù)的優(yōu)點(diǎn)與缺點(diǎn)
優(yōu)點(diǎn)就是能夠通過instanceof識(shí)別對(duì)象,缺點(diǎn)是每次實(shí)例化一個(gè)對(duì)象,都會(huì)把屬性和方法復(fù)制一遍
function CreateObj(uName) { this.userName = uName; this.showUserName = function () { return this.userName; } } var obj1 = new CreateObj('ghostwu'); var obj2 = new CreateObj('衛(wèi)莊'); console.log( obj1.showUserName === obj2.showUserName ); //false
從以上執(zhí)行結(jié)果,可以看出obj1.showUserName和obj.showUserName不是同一個(gè)【在js中,引用類型比較的是地址, 函數(shù)是一種引用類型】,而是存在兩個(gè)不同
的內(nèi)存地址,因?yàn)槊總€(gè)對(duì)象的屬性是不一樣的,這個(gè)沒有什么問題,但是方法執(zhí)行的都是一樣的代碼,所以沒有必要復(fù)制,存在多份,浪費(fèi)內(nèi)存.這就是缺點(diǎn)
怎么解決構(gòu)造函數(shù)的方法復(fù)制多次的問題?
function CreateObj(uName) { this.userName = uName; this.showUserName = showUserName; } function showUserName() { return this.userName; } var obj1 = new CreateObj('ghostwu'); var obj2 = new CreateObj('衛(wèi)莊'); console.log(obj1.showUserName === obj2.showUserName); //true
把對(duì)象的方法指向同一個(gè)全局函數(shù)showUserName, 雖然解決了多次復(fù)制問題,但是全局函數(shù)非常容易被覆蓋,也就是大家經(jīng)常說的污染全局變量.
比較好的解決方案?
通過原型(prototype)對(duì)象,把方法寫在構(gòu)造函數(shù)的原型對(duì)象上
function CreateObj(uName) { this.userName = uName; } CreateObj.prototype.showUserName = function () { return this.userName; } var obj1 = new CreateObj('ghostwu'); var obj2 = new CreateObj('衛(wèi)莊'); console.log(obj1.showUserName === obj2.showUserName); //true
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript 實(shí)例詳解循環(huán)用法
假如您需要運(yùn)行代碼多次,且每次使用不同的值,那么循環(huán)(loop)相當(dāng)方便使用。本篇文章通過幾個(gè)實(shí)例來帶你掌握循環(huán)的用法2021-11-11有關(guān)javascript的性能優(yōu)化 (repaint和reflow)
本篇文章,小編將為大家介紹,有關(guān)javascript的性能優(yōu)化(repaint和reflow),有需要的朋友可以參考一下2013-04-04圖文詳解Heap Sort堆排序算法及JavaScript的代碼實(shí)現(xiàn)
這篇文章以圖文詳解Heap Sort堆排序算法及JavaScript的代碼實(shí)現(xiàn),堆排序算法基于類二叉樹的堆數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2016-05-05移動(dòng)端自適應(yīng)flexible.js的使用方法(不用三大框架,僅寫一個(gè)單html頁面使用)推薦
這篇文章主要介紹了移動(dòng)端自適應(yīng)flexible.js使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04總結(jié)javascript三元運(yùn)算符知識(shí)點(diǎn)
這是一篇關(guān)于javascript三元運(yùn)算符的相關(guān)基礎(chǔ)知識(shí)點(diǎn)內(nèi)容,大家可以學(xué)習(xí)一下鞏固基礎(chǔ)知識(shí)。2018-09-09關(guān)于eval 與new Function 到底該選哪個(gè)?
本篇文章小編將為大家介紹,關(guān)于eval 與new Function 到底該選哪個(gè)?有需要的朋友可以參考一下2013-04-04