JS也玩OO繼承
更新時(shí)間:2007年01月11日 00:00:00 作者:
算了一下,還是來(lái)這里了 ^_^
無(wú)憂~~久違了…………貼一個(gè)原理的東東吧,
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(stroll的跟貼)
當(dāng)然,還可以通過(guò)以下幾種不用“外掛”的方法…… 不過(guò)要求使用 Script5.5 才可以使用
比如 call 方法 和 apply方法…… 以下是使用 call 的方法來(lái)實(shí)現(xiàn)的
apply也差不多,只不過(guò)后面調(diào)用的參數(shù)是數(shù)組,詳細(xì)可以自己參考MSScript5.6說(shuō)明
Bencalie 還記得以前你跟我說(shuō)call apply的使用方法么?這回這個(gè)答案算圓滿了吧?
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(stroll的跟貼)
注意觀察所謂“繼承對(duì)象”的 this.Prototype 這個(gè)變量(一開始我沒(méi)注意看,以為是關(guān)鍵字……害我苦找資料)
this.Prototype = new JSObject(); // 注意:這可不是小寫的prototype
this.Prototype.Speak = function(s){.......}
在構(gòu)造對(duì)象后直接反饋 return this.Prototype 其實(shí)這個(gè)就是 JSPObject 對(duì)象,
并不是 JSHuman 對(duì)象,所以 var o = new JSHuman();
o 這個(gè)實(shí)例是無(wú)法訪問(wèn) JSHuman 的成員的
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(bencalie的跟貼)
stroll,看了你的囘答,非常滿意。
你又把問(wèn)題勾起來(lái)了,那麼這裏Base.call(this, v_sName)用成Base.apply(this),我怎麼將v_sName傳遞到Base.BaseName,我反倒對(duì)apply的使用有點(diǎn)不好理解了。
最終使用Base.apply(this, [v_sName])用數(shù)組傳遞成功
那麼這樣看call和apply僅僅是參數(shù)不同了?
(Roman的跟貼)
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(bencalie的跟貼)
擴(kuò)展了一下,這樣子是不是有簡(jiǎn)單的OOP重載功能?
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(stroll的跟貼)
To bencalie ,是的,的確僅僅如此
不過(guò)不要認(rèn)為apply這樣是麻煩,其實(shí)如果兩個(gè)對(duì)象的構(gòu)造參數(shù)順序一樣的話,可以這么來(lái)
Base.apply(this, arguments) 很方便吧?
附上:(因?yàn)?0秒才一貼~~)
不過(guò)你那里添加一個(gè) new Base() 是認(rèn)為無(wú)法繼承的做法,其實(shí)是可以繼承方法的,O.BaseMethod() 的調(diào)用就是了 ^_^
to:bencalie(Roman的跟貼)
基對(duì)象的方法被overwrite了.為什么stroll說(shuō) var o = new JSHuman(); o 這個(gè)實(shí)例是無(wú)法訪問(wèn) JSHuman 的成員的
請(qǐng)看如下代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
stroll,方法的確繼承過(guò)來(lái)了,但我在Son對(duì)象的搆造函數(shù)裏重寫了BaseMethod()
事實(shí)上O.BaseMethod()這樣調(diào)用已經(jīng)不是Base對(duì)象的BaseMethod()方法了,而是Son對(duì)象的BaseMethod()方法,所以我把Base的一個(gè)實(shí)例儅作Son的成員base,使用
Son實(shí)例.base.BaseMethod()
的格式來(lái)引用Base的BaseMethod()方法
另外,我喜懽這句:Base.apply(this, arguments)
呵呵……收到~~(stroll的跟貼)
雖然說(shuō)JS是沒(méi)有指針了…… 不知道同時(shí)構(gòu)造一個(gè)“父對(duì)象”,一個(gè)“子對(duì)象” 再有一個(gè)函數(shù)傳遞一個(gè)對(duì)象參數(shù),這個(gè)參數(shù)使用父子共有的方法,是不是能夠分別調(diào)用相應(yīng)的方法呢? 還未了解JS 的 this 是不是相當(dāng)于 虛擬地址的指針呢?
所以替換了方法才能解決上面的疑惑(雖然這個(gè)迷惑是菜了點(diǎn),不過(guò)符合邏輯:)
還有……如果里面成員有構(gòu)造對(duì)象的函式,是不是也會(huì)像c++一樣先構(gòu)造對(duì)象,然后再執(zhí)行其他函式呢? 這個(gè)可能或則肯定是按照從上到下了~~~~語(yǔ)言規(guī)定?沒(méi)試過(guò)
有沒(méi)有試過(guò)多個(gè)父對(duì)象的繼承呢?不過(guò)也不難想到這個(gè)一步……(樹狀繼承)
這些就是偶的疑問(wèn)啦,呵呵……
無(wú)憂~~久違了…………貼一個(gè)原理的東東吧,
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(stroll的跟貼)
當(dāng)然,還可以通過(guò)以下幾種不用“外掛”的方法…… 不過(guò)要求使用 Script5.5 才可以使用
比如 call 方法 和 apply方法…… 以下是使用 call 的方法來(lái)實(shí)現(xiàn)的
apply也差不多,只不過(guò)后面調(diào)用的參數(shù)是數(shù)組,詳細(xì)可以自己參考MSScript5.6說(shuō)明
Bencalie 還記得以前你跟我說(shuō)call apply的使用方法么?這回這個(gè)答案算圓滿了吧?
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(stroll的跟貼)
注意觀察所謂“繼承對(duì)象”的 this.Prototype 這個(gè)變量(一開始我沒(méi)注意看,以為是關(guān)鍵字……害我苦找資料)
this.Prototype = new JSObject(); // 注意:這可不是小寫的prototype
this.Prototype.Speak = function(s){.......}
在構(gòu)造對(duì)象后直接反饋 return this.Prototype 其實(shí)這個(gè)就是 JSPObject 對(duì)象,
并不是 JSHuman 對(duì)象,所以 var o = new JSHuman();
o 這個(gè)實(shí)例是無(wú)法訪問(wèn) JSHuman 的成員的
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(bencalie的跟貼)
stroll,看了你的囘答,非常滿意。
你又把問(wèn)題勾起來(lái)了,那麼這裏Base.call(this, v_sName)用成Base.apply(this),我怎麼將v_sName傳遞到Base.BaseName,我反倒對(duì)apply的使用有點(diǎn)不好理解了。
最終使用Base.apply(this, [v_sName])用數(shù)組傳遞成功
那麼這樣看call和apply僅僅是參數(shù)不同了?
(Roman的跟貼)
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(bencalie的跟貼)
擴(kuò)展了一下,這樣子是不是有簡(jiǎn)單的OOP重載功能?
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
(stroll的跟貼)
To bencalie ,是的,的確僅僅如此
不過(guò)不要認(rèn)為apply這樣是麻煩,其實(shí)如果兩個(gè)對(duì)象的構(gòu)造參數(shù)順序一樣的話,可以這么來(lái)
Base.apply(this, arguments) 很方便吧?
附上:(因?yàn)?0秒才一貼~~)
不過(guò)你那里添加一個(gè) new Base() 是認(rèn)為無(wú)法繼承的做法,其實(shí)是可以繼承方法的,O.BaseMethod() 的調(diào)用就是了 ^_^
to:bencalie(Roman的跟貼)
基對(duì)象的方法被overwrite了.為什么stroll說(shuō) var o = new JSHuman(); o 這個(gè)實(shí)例是無(wú)法訪問(wèn) JSHuman 的成員的
請(qǐng)看如下代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
stroll,方法的確繼承過(guò)來(lái)了,但我在Son對(duì)象的搆造函數(shù)裏重寫了BaseMethod()
事實(shí)上O.BaseMethod()這樣調(diào)用已經(jīng)不是Base對(duì)象的BaseMethod()方法了,而是Son對(duì)象的BaseMethod()方法,所以我把Base的一個(gè)實(shí)例儅作Son的成員base,使用
Son實(shí)例.base.BaseMethod()
的格式來(lái)引用Base的BaseMethod()方法
另外,我喜懽這句:Base.apply(this, arguments)
呵呵……收到~~(stroll的跟貼)
雖然說(shuō)JS是沒(méi)有指針了…… 不知道同時(shí)構(gòu)造一個(gè)“父對(duì)象”,一個(gè)“子對(duì)象” 再有一個(gè)函數(shù)傳遞一個(gè)對(duì)象參數(shù),這個(gè)參數(shù)使用父子共有的方法,是不是能夠分別調(diào)用相應(yīng)的方法呢? 還未了解JS 的 this 是不是相當(dāng)于 虛擬地址的指針呢?
所以替換了方法才能解決上面的疑惑(雖然這個(gè)迷惑是菜了點(diǎn),不過(guò)符合邏輯:)
還有……如果里面成員有構(gòu)造對(duì)象的函式,是不是也會(huì)像c++一樣先構(gòu)造對(duì)象,然后再執(zhí)行其他函式呢? 這個(gè)可能或則肯定是按照從上到下了~~~~語(yǔ)言規(guī)定?沒(méi)試過(guò)
有沒(méi)有試過(guò)多個(gè)父對(duì)象的繼承呢?不過(guò)也不難想到這個(gè)一步……(樹狀繼承)
這些就是偶的疑問(wèn)啦,呵呵……
相關(guān)文章
JS創(chuàng)建或填充任意長(zhǎng)度數(shù)組的小技巧匯總
在JavaScript 中,我們往往會(huì)遇到需要使用某些默認(rèn)值來(lái)填充數(shù)組的情況,那么都有哪些方式可以完成這樣的任務(wù)呢?這篇文章主要給大家介紹了關(guān)于JS創(chuàng)建或填充任意長(zhǎng)度數(shù)組的小技巧,需要的朋友可以參考下2021-10-10javascript四舍五入函數(shù)代碼分享(保留后幾位)
這篇文章主要介紹了javascript四舍五入函數(shù)分享,大家參考使用吧2013-12-12JS設(shè)置時(shí)間無(wú)效問(wèn)題的解決辦法
在發(fā)送短信息驗(yàn)證碼的時(shí)候要用到j(luò)s設(shè)置時(shí)間倒序問(wèn)題,有時(shí)候會(huì)導(dǎo)致js失效問(wèn)題,怎么辦呢?今天小編給大家分享JS設(shè)置時(shí)間無(wú)效問(wèn)題的解決辦法,需要的朋友參考下吧2017-02-02JavaScript關(guān)鍵字this的使用方法詳解
與其他語(yǔ)言相比,函數(shù)的 this 關(guān)鍵字在 JavaScript 中的表現(xiàn)略有不同,此外,在嚴(yán)格模式和非嚴(yán)格模式之間也會(huì)有一些差別,本文就給大家講解一下JavaScript關(guān)鍵字中的this,需要的朋友可以參考下2023-08-08