資源描述:
《javascript中的對(duì)象和原型(三)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Javascript中的對(duì)象和原型(三)作者:?念在三角湖畔??來源:?博客園??發(fā)布時(shí)間:2012-05-3110:39??閱讀:29次??原文鏈接???全屏閱讀 ?[收藏]?? 在Javascript中的對(duì)象和原型(二)中我們提到,用構(gòu)造函數(shù)創(chuàng)建的對(duì)象里面,每個(gè)對(duì)象之間都是獨(dú)立的,這樣就會(huì)降低系統(tǒng)資源的利用率,解決這樣問題,我們就要用到下面提到的原型對(duì)象?! ∫辉蛯?duì)象 原型對(duì)象實(shí)際上就是構(gòu)造函數(shù)的一個(gè)實(shí)例對(duì)象,和普通的實(shí)例對(duì)象沒有本質(zhì)上的區(qū)別??梢园囟愋偷乃袑?shí)例的共享屬性或者方法。這樣,如果我們需要修改所有實(shí)例中的屬性或者方法,就只需要修改一
2、處,就能夠影響到所有實(shí)例了。因?yàn)樵椭械膶傩院头椒ㄊ枪蚕淼?。我們可以看下兩個(gè)圖示:???構(gòu)造函數(shù)方式原型模式方式 從上面的圖示中我們就不難看出,為何下面的代碼中"user1.show==user2.show;"返回的是ture,因?yàn)閟how方法是所有由User構(gòu)造函數(shù)創(chuàng)建的對(duì)象所共享的,而不是每個(gè)對(duì)象都各自創(chuàng)建了一個(gè)show方法。每個(gè)JavaScript函數(shù)都有prototype屬性,這個(gè)屬性引用了一個(gè)對(duì)象,這個(gè)對(duì)象就是原型對(duì)象。原型對(duì)象初始化的時(shí)候是空的,我們可以在里面自定義任何屬性和方法,這些方法和屬性都將被該構(gòu)造函數(shù)所創(chuàng)建的對(duì)象繼承。Prototype
3、,這個(gè)屬性引用了一個(gè)對(duì)象,它又有一個(gè)屬性,constructor,它的值是一個(gè)函數(shù)對(duì)象。 在原型中添加屬性和方法可以參照如下代碼:functionUser(name,age){//構(gòu)造方法this.name=name;//對(duì)象屬性this.age=age;}User.prototype.addr='湖北武漢';//在原型中添加屬性User.prototype.show=function(){//在原型中添加方法alert(this.name+'
4、'+this.age);};varuser1=newUser('ZXC',22);//創(chuàng)建實(shí)例varuser2=n
5、ewUser('CXZ',21);user1.show();//調(diào)用show()方法user2.show();alert(user1.show==user2.show);//返回true說明show方法是共享的alert(user1.addr);//'湖北武漢'alert(user2.addr);//'湖北武漢' 但是有個(gè)問題是:如果我們既在構(gòu)造方法中添加了一個(gè)屬性、又在原型中添加了該屬性,還在實(shí)例中添加了該屬性,那么我們?cè)L問的究竟是哪一個(gè)屬性呢?我們先看看下面的代碼:functionUser(name,age){//構(gòu)造方法this.name=name;/
6、/對(duì)象屬性this.age=age;this.addr='湖北恩施';}User.prototype.addr='湖北武漢';//在原型中添加屬性varuser1=newUser('ZXC',22);//創(chuàng)建實(shí)例varuser2=newUser('CXZ',21);alert(user1.addr);//'湖北恩施'deleteuser1.addr;//刪除對(duì)象屬性alert(user1.addr);//'湖北武漢'deleteUser.prototype.addr;alert(user1.addr);//'undefined'user2.addr='武漢';
7、alert(user2.addr);//'武漢' 從上面的代碼可以看出,如果我們同時(shí)申明了對(duì)象屬性、原型屬性和實(shí)例屬性,那么調(diào)用時(shí)顯示的優(yōu)先級(jí)應(yīng)該是:實(shí)例屬性>對(duì)象屬性>原型屬性。這就是采用了就近原則:調(diào)用時(shí)首先查找實(shí)例中是否直接定義了這個(gè)屬性,有則返回實(shí)例屬性;如果實(shí)例屬性中沒有就去構(gòu)造函數(shù)中查找,有則返回;如果前面兩者都沒有就去原型對(duì)象中查找,如果沒有則返回undefined?! 《?dòng)態(tài)原型模式 有人可能會(huì)覺得上面代碼中的寫法感覺很別扭,因?yàn)樵椭械姆椒ê蛯傩耘c構(gòu)造函數(shù)中定義的對(duì)象屬性和方法不在一塊兒,要是能封裝在一起就更加直觀,如果要解決這個(gè)問題,就
8、要用到動(dòng)態(tài)原型模式;//動(dòng)態(tài)原型模式functionUser(name,age){//構(gòu)造方法this.name=name;//屬性this.age=age;this.addr='湖北恩施';User.prototype.addr='湖北武漢';//在原型中添加屬性User.prototype.show=function(){//在原型中添加方法alert(this.name+'
9、'+this.age+'
10、'+this.addr);};}varuser1=newUser('ZXC',22);//創(chuàng)建實(shí)例varuser2=newUser('CXZ',21);us
11、er1.show();//調(diào)用show