[js高手之路]构造函数的基本特性与优缺点
上文,通過(guò)基本的對(duì)象創(chuàng)建問(wèn)題了解了構(gòu)造函數(shù),本文,我們接著上文繼續(xù)了解構(gòu)造函數(shù)的基本特性,以及優(yōu)缺點(diǎn).
每個(gè)對(duì)象上面都有一個(gè)constructor屬性( 嚴(yán)格意義上來(lái)說(shuō),是原型上的,對(duì)象是通過(guò)查找到原型找到 constructor屬性 ).后面講到原型的時(shí)候,我會(huì)用示意圖的方式說(shuō)明
1 function CreateObj(uName) { 2 this.userName = uName; 3 this.showUserName = function () { 4 return this.userName; 5 } 6 } 7 var obj1 = new CreateObj('ghostwu'); 8 var obj2 = new CreateObj('衛(wèi)莊'); 9 console.log( obj1.constructor === CreateObj ); //true 10 console.log( obj2.constructor === CreateObj ); //true默認(rèn)情況下,對(duì)象的constructor等于實(shí)例化對(duì)象的構(gòu)造函數(shù), constructor最初的作用是用來(lái)標(biāo)識(shí)對(duì)象的,但是并不是特別準(zhǔn)確,因?yàn)閏onstructor能被修改,
識(shí)別對(duì)象一般用instanceof關(guān)鍵字.
什么是instanceof?
要理解這個(gè)關(guān)鍵字,需要搞清楚原型鏈,這里,我提前把他放出來(lái)
//假設(shè)instanceof運(yùn)算符左邊是L,右邊是R L instanceof R //instanceof運(yùn)算時(shí),通過(guò)判斷L的原型鏈上是否存在R.prototype L.__proto__.__proto__ ..... === R.prototype ? //如果存在返回true 否則返回false注意:instanceof運(yùn)算時(shí)會(huì)遞歸查找L的原型鏈,即L.__proto__.__proto__.__proto__.__proto__...直到找到了或者找到頂層為止。
所以一句話理解instanceof的運(yùn)算規(guī)則為:
instanceof檢測(cè)左側(cè)的__proto__原型鏈上,是否存在右側(cè)的prototype原型。
console.log( obj1 instanceof Object ); //trueconsole.log( obj2 instanceof Object ); //trueconsole.log( obj1 instanceof CreateObj ); //trueconsole.log( obj2 instanceof CreateObj ); //trueobj1,obj2之所以是Object的實(shí)例,因?yàn)樗袑?duì)象繼承自O(shè)bject
借用構(gòu)造函數(shù)
一個(gè)空對(duì)象,可以借用現(xiàn)有的構(gòu)造函數(shù),完成屬性和方法的復(fù)制
1 function CreateObj(uName) { 2 this.userName = uName; 3 this.showUserName = function () { 4 return this.userName; 5 } 6 } 7 var obj = new Object(); 8 CreateObj.call( obj, 'ghostwu' ); 9 console.log( obj.userName ); //ghostwu 10 console.log( obj.showUserName() ); //ghostwu構(gòu)造函數(shù)的優(yōu)點(diǎn)與缺點(diǎn)
優(yōu)點(diǎn)就是能夠通過(guò)instanceof識(shí)別對(duì)象,缺點(diǎn)是每次實(shí)例化一個(gè)對(duì)象,都會(huì)把屬性和方法復(fù)制一遍
1 var obj1 = new CreateObj('ghostwu'); 2 var obj2 = new CreateObj('衛(wèi)莊'); 3 4 console.log( obj1.showUserName === obj2.showUserName ); //false從以上執(zhí)行結(jié)果,可以看出obj1.showUserName和obj.showUserName不是同一個(gè)【在js中,引用類(lèi)型比較的是地址, 函數(shù)是一種引用類(lèi)型】,而是存在兩個(gè)不同
的內(nèi)存地址,因?yàn)槊總€(gè)對(duì)象的屬性是不一樣的,這個(gè)沒(méi)有什么問(wèn)題,但是方法執(zhí)行的都是一樣的代碼,所以沒(méi)有必要復(fù)制,存在多份,浪費(fèi)內(nèi)存.這就是缺點(diǎn)
怎么解決構(gòu)造函數(shù)的方法復(fù)制多次的問(wèn)題?
1 function CreateObj(uName) { 2 this.userName = uName; 3 this.showUserName = showUserName; 4 } 5 function showUserName (){ 6 return this.userName; 7 } 8 var obj1 = new CreateObj('ghostwu'); 9 var obj2 = new CreateObj('衛(wèi)莊'); 10 console.log( obj1.showUserName === obj2.showUserName ); //true把對(duì)象的方法指向同一個(gè)全局函數(shù)showUserName, 雖然解決了多次復(fù)制問(wèn)題,但是全局函數(shù)非常容易被覆蓋,也就是大家經(jīng)常說(shuō)的污染全局變量.
比較好的解決方案?
通過(guò)原型(prototype)對(duì)象,把方法寫(xiě)在構(gòu)造函數(shù)的原型對(duì)象上
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function(){ 5 return this.userName; 6 } 7 var obj1 = new CreateObj('ghostwu'); 8 var obj2 = new CreateObj('衛(wèi)莊'); 9 console.log( obj1.showUserName === obj2.showUserName ); //true什么是原型對(duì)象,以及原型鏈?且聽(tīng)下回分解
轉(zhuǎn)載于:https://www.cnblogs.com/ghostwu/p/7434609.html
總結(jié)
以上是生活随笔為你收集整理的[js高手之路]构造函数的基本特性与优缺点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 48dB降噪、38小时续航!小米降噪耳机
- 下一篇: How to find Material