隨筆-295  評論-26  文章-1  trackbacks-0
          javascript的繼承機制并不是明確規(guī)定的,而是通過模仿實現(xiàn)的,意味著繼承不是由解釋程序處理,開發(fā)者有權(quán)決定最適合的繼承方式. 下面我給出幾種常用的方法: 1 .對象冒充 原理: 構(gòu)造函數(shù)使用this關(guān)鍵字給所有屬性和方法賦值, 因為構(gòu)造函數(shù)只是一個函數(shù),所以可以使ClassA的構(gòu)造函數(shù)成為classB的方法,然后調(diào)用它.這樣classB就會收到classA的構(gòu)造函數(shù)中定義的屬性和方法.例子: function classA(name) { this.name=name; this.showName=function(){alert(this.name);} } function classB(name) { this.newMethod = classA; this.newMethod(name); } obj = new classA("hero"); objB = new classB("dby"); obj.showName(); // print hero objB.showName(); // print dby 說明classB 繼承了classA的方法. 對象冒充可以實現(xiàn)多重繼承 例如 function classz(){ this.newMethod = classX; this.newMethod(); delete this.newMethod; this.newMethod=classY; this.newMethod(): delete this.newMethod; } 但是如果classX和classY有相同的屬性或者方法,classY具有高優(yōu)先級. 2.call()方法 call方法使與經(jīng)典的對象冒充法就相近的方法,它的第一個參數(shù)用作this的對象,其他參數(shù)都直接傳遞給函數(shù)自身. function sayName(perfix) { alert(perfix+this.name); } obj= new Object(); obj.name="hero"; sayName.call(obj,"hello," ); function classA(name) { this.name=name; this.showName=function(){alert(this.name);}; } function classB(name) { classA.call(this,name); } objB = new classB("bing"); objB.showName();////說明classB繼承classA的showName方法 3.apply()方法 aplly()方法有2個參數(shù),一個用作this對象,一個使傳遞給函數(shù)的參數(shù)數(shù)組. function sayName(perfix) { alert(perfix+this.name); } obj= new Object(); obj.name="hero"; sayName.aplly(obj,new Array("hello,") ); 4. 原型鏈 prototype對象的任何屬性和方法都會被傳遞給對應(yīng)類的所有實例,原型鏈就是用這種方式來顯現(xiàn)繼承. function classA (){} classA.prototype.name="hero"; classA.prototype.showName=function(){alert(this.name)} function classB(){} classB.prototype=new classA(); objb = new classB() objb.showName();//print hero 說明b繼承了a的方法 這里需要注意 調(diào)用classA的構(gòu)造函數(shù)時,沒有給它傳遞參數(shù),這是原型鏈的標(biāo)準(zhǔn)做法,確保函數(shù)的構(gòu)造函數(shù)沒有任何參數(shù). 并且 子類的所有屬性和方法,必須出現(xiàn)在prototype屬性被賦值后,應(yīng)為在它之前賦的值會被刪除.因為對象的prototype屬性被替換成了新對象,添加了新方法的原始對象將被銷毀. 5 混和方式 就是用冒充方式 定義構(gòu)造函數(shù)屬性,用原型法定義對象方法. function classA(name) { this.name=name; } classA.prototype.showName=function(){alert(this.name)} function classB(name) { classA.call(this,name); } classB.prototype = new classA(); classB.prototype.showName1=function(){alert(this.name+"*****");}; obj = new classB("hero"); obj.showName(); obj.showName1(); 在classB的構(gòu)造函數(shù)中通過調(diào)用call方法 繼承classA中的name屬性,用原型鏈來繼承classA的showName方法.

          大盤預(yù)測 國富論
          posted on 2009-07-16 13:47 華夢行 閱讀(120) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 托克逊县| 台中县| 乐业县| 克拉玛依市| 万安县| 张家口市| 望奎县| 广州市| 安新县| 灵山县| 高碑店市| 宣恩县| 郁南县| 永清县| 澎湖县| 沙湾县| 韩城市| 山丹县| 丹棱县| 临沂市| 安国市| 金川县| 上栗县| 阳原县| 天全县| 穆棱市| 城市| 汝城县| 临猗县| 松滋市| 绥德县| 郸城县| 永平县| 嘉荫县| 天门市| 北京市| 巨鹿县| 颍上县| 翁源县| 渑池县| 涟源市|