我們先來(lái)一個(gè)簡(jiǎn)單的構(gòu)造函數(shù)+原型對(duì)象的小程序
function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAge; } CreateObj.prototype.showUserName = function () { return this.userName; } CreateObj.prototype.showUserAge = function () { return this.userAge; }這個(gè)程序,沒有什么問(wèn)題,但是非常的冗余,每次擴(kuò)展一個(gè)方法,都要寫一次原型對(duì)象,我們可以把原型對(duì)象prototype當(dāng)做一個(gè)字面量對(duì)象,所有的方法都在字面量對(duì)象中擴(kuò)展,可以達(dá)到同樣的效果:
CreateObj.prototype = { showUserAge : function(){ return this.userAge; }, showUserName : function(){ return this.userName; }, } var obj1 = new CreateObj( 'ghostwu', 22 ); var obj2 = new CreateObj( '衛(wèi)莊', 24 ); console.log( obj1.showUserName(), obj1.showUserAge() ); //ghostwu 22 console.log( obj2.showUserName(), obj2.showUserAge() ); //衛(wèi)莊 24但是這種原型(prototype)對(duì)象的寫法,屬于重寫了CreateObj的默認(rèn)原型對(duì)象,造成的第一個(gè)問(wèn)題就是constructor不再指向CreateObj.
沒有重寫之前,constructor指向CreateObj
function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAge; } CreateObj.prototype.showUserName = function () { return this.userName; } CreateObj.prototype.showUserAge = function () { return this.userAge; } console.log( CreateObj.prototype.constructor === CreateObj ); //true重寫之后,constructor指向Object
CreateObj.prototype = { showUserAge : function(){ return this.userAge; }, showUserName : function(){ return this.userName; }, } console.log( CreateObj.prototype.constructor === CreateObj ); //false console.log( CreateObj.prototype.constructor === Object ); //true所以說(shuō),constructor不能準(zhǔn)確的標(biāo)識(shí)對(duì)象,因?yàn)樗麜?huì)被修改
我們之前寫的程序,基本都是在原型對(duì)象(prototype)上擴(kuò)展完了方法之后,再實(shí)例化對(duì)象,我們看下,先實(shí)例化對(duì)象,再在原型對(duì)象(prototype)上擴(kuò)展函數(shù),
實(shí)例對(duì)象是否能正常的調(diào)用到擴(kuò)展的方法?
function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAge; } var obj1 = new CreateObj( 'ghostwu', 22 ); CreateObj.prototype.showUserName = function(){ return this.userName; } console.log( obj1.showUserName() ); //ghostwu可以正常調(diào)用,但是,如果原型對(duì)象是重寫的,就調(diào)用不到了
function CreateObj( uName, uAge ) { this.userName = uName; this.userAge = uAge; } var obj1 = new CreateObj( 'ghostwu', 22 ); CreateObj.prototype = { showUserName : function(){ return this.userName; } } console.log( obj1.showUserName() ); //報(bào)錯(cuò)
新聞熱點(diǎn)
疑難解答
圖片精選