JavaScript構(gòu)造函數(shù)詳解
構(gòu)造函數(shù)就是初始化一個(gè)實(shí)例對(duì)象,對(duì)象的prototype屬性是繼承一個(gè)實(shí)例對(duì)象。
構(gòu)造函數(shù)注意事項(xiàng):
1.默認(rèn)函數(shù)首字母大寫
2.構(gòu)造函數(shù)并沒(méi)有顯示返回任何東西。new 操作符會(huì)自動(dòng)創(chuàng)建給定的類型并返回他們,當(dāng)調(diào)用構(gòu)造函數(shù)時(shí),new會(huì)自動(dòng)創(chuàng)建this對(duì)象,且類型就是構(gòu)造函數(shù)類型。
3.也可以在構(gòu)造函數(shù)中顯示調(diào)用return.如果返回的值是一個(gè)對(duì)象,它會(huì)代替新創(chuàng)建的對(duì)象實(shí)例返回。如果返回的值是一個(gè)原始類型,它會(huì)被忽略,新創(chuàng)建的實(shí)例會(huì)被返回。
function Person( name){ this.name =name; } var p1=new Person('John');
等同于:
function person(name ){ Object obj =new Object(); obj.name =name; return obj; } var p1= person("John");
4.因?yàn)闃?gòu)造函數(shù)也是函數(shù),所以可以直接被調(diào)用,但是它的返回值為undefine,此時(shí)構(gòu)造函數(shù)里面的this對(duì)象等于全局this對(duì)象。this.name其實(shí)就是創(chuàng)建一個(gè)全局的變量name。在嚴(yán)格模式下,當(dāng)你補(bǔ)通過(guò)new 調(diào)用Person構(gòu)造函數(shù)會(huì)出現(xiàn)錯(cuò)誤。
5.也可以在構(gòu)造函數(shù)中用Object.defineProperty()方法來(lái)幫助我們初始化:
function Person( name){ Object.defineProperty(this, "name"{ get :function(){ return name; }, set:function (newName){ name =newName; }, enumerable :true, //可枚舉,默認(rèn)為false configurable:true //可配置 }); } var p1=new Person('John');
6.在構(gòu)造函數(shù)中使用原型對(duì)象
//比直接在構(gòu)造函數(shù)中寫的效率要高的多 Person.prototype.sayName= function(){ console.log(this.name); };
但是如果方法比較多的話,大多人會(huì)采用一種更簡(jiǎn)潔的方法:直接使用一個(gè)對(duì)象字面形式替換原型對(duì)象,如下:
Person.prototype ={ sayName :function(){ console.log(this.name); }, toString :function(){ return "[Person "+ this.name+"]" ; } };
這種方式非常流行,因?yàn)槟悴挥枚啻捂I入Person.prototype,但有一個(gè)副作用你一定要注意:
使用字面量形式改寫了原型對(duì)象改變了構(gòu)造函數(shù)的屬性,因此他指向Object而不是Person。這是因?yàn)樵蛯?duì)象具有一個(gè)constructor屬性,這是其他對(duì)象實(shí)例所沒(méi)有的。當(dāng)一個(gè)函數(shù)被創(chuàng)建時(shí),它的prototype屬性也被創(chuàng)建,且該原型對(duì)象的constructor屬性指向該函數(shù)。當(dāng)使用對(duì)象字面量形式改寫原型對(duì)象時(shí),其constructor屬性將被置為泛用對(duì)象Object.為了避免這一點(diǎn),需要在改寫原型對(duì)象的時(shí)候手動(dòng)重置constructor,如下:
Person.prototype ={ constructor :Person, sayName :function(){ console.log(this.name); }, toString :function(){ return "[Person "+ this.name+"]" ; } };
再次測(cè)試:
p1.constructor===Person
true
p1.constructor===Object
false
p1 instanceof Person
true
相關(guān)文章
原生JS 購(gòu)物車及購(gòu)物頁(yè)面的cookie使用方法
下面小編就為大家?guī)?lái)一篇原生JS 購(gòu)物車及購(gòu)物頁(yè)面的cookie使用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08基于構(gòu)造函數(shù)的五種繼承方法小結(jié)
下面小編就為大家?guī)?lái)一篇基于構(gòu)造函數(shù)的五種繼承方法小結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07js之encodeURI、encodeURIComponent、decodeURI、decodeURIComponent
這篇文章主要介紹了js之encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04JS彈性運(yùn)動(dòng)實(shí)現(xiàn)方法分析
這篇文章主要介紹了JS彈性運(yùn)動(dòng)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了JS實(shí)現(xiàn)彈性運(yùn)動(dòng)的原理、相關(guān)技術(shù)細(xì)節(jié)與實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-12-12JavaScript實(shí)現(xiàn)顯示函數(shù)調(diào)用堆棧的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)顯示函數(shù)調(diào)用堆棧的方法,實(shí)例分析了JavaScript顯示函數(shù)調(diào)用堆棧的具體作用與使用方法,需要的朋友可以參考下2016-04-04