JS也玩OO繼承
更新時間:2007年01月11日 00:00:00 作者:
算了一下,還是來這里了 ^_^
無憂~~久違了…………貼一個原理的東東吧,
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(stroll的跟貼)
當然,還可以通過以下幾種不用“外掛”的方法…… 不過要求使用 Script5.5 才可以使用
比如 call 方法 和 apply方法…… 以下是使用 call 的方法來實現的
apply也差不多,只不過后面調用的參數是數組,詳細可以自己參考MSScript5.6說明
Bencalie 還記得以前你跟我說call apply的使用方法么?這回這個答案算圓滿了吧?
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(stroll的跟貼)
注意觀察所謂“繼承對象”的 this.Prototype 這個變量(一開始我沒注意看,以為是關鍵字……害我苦找資料)
this.Prototype = new JSObject(); // 注意:這可不是小寫的prototype
this.Prototype.Speak = function(s){.......}
在構造對象后直接反饋 return this.Prototype 其實這個就是 JSPObject 對象,
并不是 JSHuman 對象,所以 var o = new JSHuman();
o 這個實例是無法訪問 JSHuman 的成員的
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(bencalie的跟貼)
stroll,看了你的囘答,非常滿意。
你又把問題勾起來了,那麼這裏Base.call(this, v_sName)用成Base.apply(this),我怎麼將v_sName傳遞到Base.BaseName,我反倒對apply的使用有點不好理解了。
最終使用Base.apply(this, [v_sName])用數組傳遞成功
那麼這樣看call和apply僅僅是參數不同了?
(Roman的跟貼)
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(bencalie的跟貼)
擴展了一下,這樣子是不是有簡單的OOP重載功能?
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(stroll的跟貼)
To bencalie ,是的,的確僅僅如此
不過不要認為apply這樣是麻煩,其實如果兩個對象的構造參數順序一樣的話,可以這么來
Base.apply(this, arguments) 很方便吧?
附上:(因為30秒才一貼~~)
不過你那里添加一個 new Base() 是認為無法繼承的做法,其實是可以繼承方法的,O.BaseMethod() 的調用就是了 ^_^
to:bencalie(Roman的跟貼)
基對象的方法被overwrite了.為什么stroll說 var o = new JSHuman(); o 這個實例是無法訪問 JSHuman 的成員的
請看如下代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
stroll,方法的確繼承過來了,但我在Son對象的搆造函數裏重寫了BaseMethod()
事實上O.BaseMethod()這樣調用已經不是Base對象的BaseMethod()方法了,而是Son對象的BaseMethod()方法,所以我把Base的一個實例儅作Son的成員base,使用
Son實例.base.BaseMethod()
的格式來引用Base的BaseMethod()方法
另外,我喜懽這句:Base.apply(this, arguments)
呵呵……收到~~(stroll的跟貼)
雖然說JS是沒有指針了…… 不知道同時構造一個“父對象”,一個“子對象” 再有一個函數傳遞一個對象參數,這個參數使用父子共有的方法,是不是能夠分別調用相應的方法呢? 還未了解JS 的 this 是不是相當于 虛擬地址的指針呢?
所以替換了方法才能解決上面的疑惑(雖然這個迷惑是菜了點,不過符合邏輯:)
還有……如果里面成員有構造對象的函式,是不是也會像c++一樣先構造對象,然后再執(zhí)行其他函式呢? 這個可能或則肯定是按照從上到下了~~~~語言規(guī)定?沒試過
有沒有試過多個父對象的繼承呢?不過也不難想到這個一步……(樹狀繼承)
這些就是偶的疑問啦,呵呵……
無憂~~久違了…………貼一個原理的東東吧,
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(stroll的跟貼)
當然,還可以通過以下幾種不用“外掛”的方法…… 不過要求使用 Script5.5 才可以使用
比如 call 方法 和 apply方法…… 以下是使用 call 的方法來實現的
apply也差不多,只不過后面調用的參數是數組,詳細可以自己參考MSScript5.6說明
Bencalie 還記得以前你跟我說call apply的使用方法么?這回這個答案算圓滿了吧?
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(stroll的跟貼)
注意觀察所謂“繼承對象”的 this.Prototype 這個變量(一開始我沒注意看,以為是關鍵字……害我苦找資料)
this.Prototype = new JSObject(); // 注意:這可不是小寫的prototype
this.Prototype.Speak = function(s){.......}
在構造對象后直接反饋 return this.Prototype 其實這個就是 JSPObject 對象,
并不是 JSHuman 對象,所以 var o = new JSHuman();
o 這個實例是無法訪問 JSHuman 的成員的
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(bencalie的跟貼)
stroll,看了你的囘答,非常滿意。
你又把問題勾起來了,那麼這裏Base.call(this, v_sName)用成Base.apply(this),我怎麼將v_sName傳遞到Base.BaseName,我反倒對apply的使用有點不好理解了。
最終使用Base.apply(this, [v_sName])用數組傳遞成功
那麼這樣看call和apply僅僅是參數不同了?
(Roman的跟貼)
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(bencalie的跟貼)
擴展了一下,這樣子是不是有簡單的OOP重載功能?
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
(stroll的跟貼)
To bencalie ,是的,的確僅僅如此
不過不要認為apply這樣是麻煩,其實如果兩個對象的構造參數順序一樣的話,可以這么來
Base.apply(this, arguments) 很方便吧?
附上:(因為30秒才一貼~~)
不過你那里添加一個 new Base() 是認為無法繼承的做法,其實是可以繼承方法的,O.BaseMethod() 的調用就是了 ^_^
to:bencalie(Roman的跟貼)
基對象的方法被overwrite了.為什么stroll說 var o = new JSHuman(); o 這個實例是無法訪問 JSHuman 的成員的
請看如下代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
stroll,方法的確繼承過來了,但我在Son對象的搆造函數裏重寫了BaseMethod()
事實上O.BaseMethod()這樣調用已經不是Base對象的BaseMethod()方法了,而是Son對象的BaseMethod()方法,所以我把Base的一個實例儅作Son的成員base,使用
Son實例.base.BaseMethod()
的格式來引用Base的BaseMethod()方法
另外,我喜懽這句:Base.apply(this, arguments)
呵呵……收到~~(stroll的跟貼)
雖然說JS是沒有指針了…… 不知道同時構造一個“父對象”,一個“子對象” 再有一個函數傳遞一個對象參數,這個參數使用父子共有的方法,是不是能夠分別調用相應的方法呢? 還未了解JS 的 this 是不是相當于 虛擬地址的指針呢?
所以替換了方法才能解決上面的疑惑(雖然這個迷惑是菜了點,不過符合邏輯:)
還有……如果里面成員有構造對象的函式,是不是也會像c++一樣先構造對象,然后再執(zhí)行其他函式呢? 這個可能或則肯定是按照從上到下了~~~~語言規(guī)定?沒試過
有沒有試過多個父對象的繼承呢?不過也不難想到這個一步……(樹狀繼承)
這些就是偶的疑問啦,呵呵……

