欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript 面向對象編程基礎 多態(tài)

 更新時間:2009年08月21日 01:40:06   作者:  
javascript 面向對象編程基礎 多態(tài) 的實現(xiàn)方法說明,大家可以看下下面的代碼。
Javascript已經可以模擬出面向對象的封裝和繼承特性,但是不幸的是Javascript對多態(tài)特性的支持非常弱!其它面向對象語言的多態(tài)一般都由方法重載和虛方法來實現(xiàn)多態(tài),Javascript也通過這兩種途徑來實現(xiàn)!

重載:由于Javascript是弱類型的語言,而且又支持可變參數(shù),當我們定義重載方法的時候,解釋器無法通過參數(shù)類型和參數(shù)個數(shù)來區(qū)分不同的重載方法,因此方法重載是不被支持的!當先后定義了同名的方法的時候,后定義的方法會覆蓋先定義的方法!

既然解釋器無法分辨重載方法,那就手動區(qū)分不同的方法:
復制代碼 代碼如下:

var MyClass=function(){
var AddNum=function(a,b){
return a+b;
}
var AddString=function(a,b){
return "I am here"+a+b;
}
this.Add=function(a,b){
if(typeof(a)=="number")
return AddNum(a,b);
else
return AddString(a,b);
}
}
var MyObj = new MyClass();
var X = MyObj.Add(5,6);
var Y = MyObj.Add("A","FFFFFF");
alert(X); //結果:11
alert(Y); //結果:I am hereAFFFFFF

虛方法:
復制代碼 代碼如下:

function BaseClass(){
this.Hello=function(){
return this.Say();
}
}
function MyClassA(){
this.Say=function(){
return "Hello";
}
}
function MyClassB(){
this.Say=function(){
return "This is MyClassB";
}
}
MyClassA.prototype = new BaseClass();
MyClassB.prototype = new BaseClass();
var ObjA = new MyClassA();
var XX = ObjA.Hello();
alert(XX); //結果:Hello
var ObjB = new MyClassB();
var YY = ObjB.Hello();
alert(YY); //結果:This is MyClassB

由于Javascript解釋執(zhí)行的特性,因此可以再基類中調用將要在派生類中定義的方法,那么這個基類方法就相當于虛方法,可以實現(xiàn)模擬多態(tài)!
js的重載和重寫(覆寫):
重載的意思是,“同一個名字的函數(shù)(注意這里包括函數(shù))或方法可以有多個實現(xiàn),它們依靠參數(shù)的類型和(或)參數(shù)的個數(shù)來區(qū)分識別”。而重寫(覆蓋)的意思是,“子類中可以定義與父類中同名,并且參數(shù)類型和個數(shù)也相同的方法,這些方法的定義后,在子類的實例化對象中,父類中繼承的這些同名方法將被隱藏”。重載的英文是overload,覆蓋的英文是override。好了,概念介紹到這里,你猜到我要說什么了嗎?嘿嘿,Code is cheap.看重載代碼:
復制代碼 代碼如下:

// 通過函數(shù)的arguments屬性實現(xiàn)重載
function add() {
var sum = 0 ;
for ( var i = 0 ; i < arguments.length; i ++ ) {
sum += arguments[i];
}
return sum;
}
function test() {
alert(add());
alert(add( 1 , 2 ));
alert(add( 1 , 2 , 3 ));
}

通過代碼運行結果,這樣就實現(xiàn)了任意多個參數(shù)加法函數(shù)的重載了。當然,你還可以在函數(shù)中通過 instanceof 或者 constructor 來判斷每個參數(shù)的類型,來決定后面執(zhí)行什么操作,實現(xiàn)更為復雜的函數(shù)或方法重載??傊?,javascript 的重載,是在函數(shù)中由用戶自己通過操作 arguments 這個屬性來實現(xiàn)的。關于arguments的特性,前面我已經做了簡單介紹,參考拙文:http://blog.csdn.net/zhanglingdll_39/archive/2009/08/20/4465670.aspx 。
下面重點理解js重寫的實現(xiàn):
// 為類添加靜態(tài)方法inherit表示繼承于某類
Function.prototype.inherit = function (baseClass) {
for ( var p in baseClass.prototype) {
this .prototype[p] = baseClass.prototype[p];
}
}
// js實現(xiàn)重寫
function parentClass() { // 父類
}
parentClass.prototype.method = function () {
alert( " parentClass method " );
}
function subClass() { // 子類
}
//
復制代碼 代碼如下:

下面這一句和subClass.prototype = new parentClass();等價
subClass.inherit(parentClass);
// subClass.prototype.method = function() { // 子類重寫了父類的方法 -- 去掉注釋運行試試看
// alert("subClass method");
// }
function test() {
var obj = new subClass();
obj.method();
}
這樣,子類中定義的method 就覆蓋了從父類中繼承來的method 方法了。這是你可能會問,如何在子類中調用父類的method方法呢?好的,看實現(xiàn)如下:
// 為類添加靜態(tài)方法inherit表示繼承于某類
Function.prototype.inherit = function (baseClass) {
for ( var p in baseClass.prototype) {
this .prototype[p] = baseClass.prototype[p];
}
}
/* 參考文章:http://menjoy.javaeye.com/blog/127847 */
// js實現(xiàn)重寫
function parentClass() {
this .method = function () {
alert( " parentClass method " );
}
}
function subClass() {
var method = this .method;
this .method = function () {
method.call( this );
alert( " subClass method " );
}
}
subClass.prototype = new parentClass();
// subClass.inherit(parentClass); //這一句貌似和上一句subClass.prototype = new parentClass();等價,其實呢????(注釋上一行,運行這一行看看)
subClass.prototype.constructor = subClass;
function test() {
var obj = new subClass();
obj.method();
}

好了,關于多態(tài)的介紹就到這里。js面向對象編程猶如浩瀚海洋廣闊無邊,我這三篇參考別人的文章寫出來的js面向對象基礎只能當作入門者學習的參考。學無止境,參考了網上幾篇老大們的牛文,深知自身技術的淺薄,對于已經超越了解階段的讀者,還是看看園子里高人的技術文章吧。我這里要先拜謝園子里的高人了。

相關文章

  • javascript 寫類方式之九

    javascript 寫類方式之九

    這里引入的是YUI 2.7.0版,只需引入yahoo.js。YUI引入了命名空間,類似于java的包。以下yahoo的工具函數(shù)包
    2009-07-07
  • JS 繼承實例分析

    JS 繼承實例分析

    主要有三種方法: 1. this.method=Parent; this.method=Parent's constructor 2. Parent.call(this,arg,arg,arg.....);3.Parent.apply(this,arg.arg...) //for Array 還是來點實際的吧...
    2008-11-11
  • 手把手教你自己寫一個js表單驗證框架的方法

    手把手教你自己寫一個js表單驗證框架的方法

    其實我自己也就能簡單用用js而已,但是呢,相對很多初學者來說多懂了點Know How所以斗膽孟浪一下,將一些所得記錄下來,以供更多的初學者能夠知道一個東西的實現(xiàn)過程,省去在源碼里摸索的過程。
    2010-09-09
  • javascript 寫類方式之八

    javascript 寫類方式之八

    這里用的是Ext core3.0,Ext中用Ext.extend來定義一個類(當然它更多用來擴展一個類),Ext整個框架各種控件如Panel,MessageBox等都是用Ext.extend方法來擴展。這里僅僅用它來定義一個最簡單的類。
    2009-07-07
  • Javascript面向對象編程(三) 非構造函數(shù)的繼承

    Javascript面向對象編程(三) 非構造函數(shù)的繼承

    這個系列的第一部分介紹了"封裝",第二部分介紹了使用構造函數(shù)實現(xiàn)"繼承"。
    2011-08-08
  • JavaScript 類的定義和引用 JavaScript高級培訓 自定義對象

    JavaScript 類的定義和引用 JavaScript高級培訓 自定義對象

    在Java語言中,我們可以定義自己的類,并根據(jù)這些類創(chuàng)建對象來使用,在Javascript中,我們也可以定義自己的類,例如定義User類、Hashtable類等等。
    2010-04-04
  • JavaScript 核心參考教程 內置對象

    JavaScript 核心參考教程 內置對象

    JavaScript 是根據(jù) "ECMAScript"標準制定的網頁腳本語言。這個標準由 ECMA 組織發(fā)展和維護。ECMA-262 是正式的 JavaScript 標準。
    2009-10-10
  • JS類的封裝及實現(xiàn)代碼

    JS類的封裝及實現(xiàn)代碼

    js并不是一種面向對向的語言, 沒有提供對類的支持, 因此我們不能像在傳統(tǒng)的語言里那樣 用class來定義類, 但我們可以利用js的閉包封裝機制來實現(xiàn)js類, 我們來封裝一個簡的Shape類.
    2009-12-12
  • Javascript 面向對象編程(一) 封裝

    Javascript 面向對象編程(一) 封裝

    我覺得,Object(對象)最難。因為Javascript的Object模型很獨特,和其他語言都不一樣,初學者不容易掌握。
    2011-08-08
  • 最簡單的javascript對象實例代碼

    最簡單的javascript對象實例代碼

    非常簡單的js面向對象實例代碼,主要是利用了this,對于js面向對象的學習資料,可以查看腳本之家以前的文章。
    2009-12-12

最新評論