咖啡Java
站在巨人的肩上
Flying in the world of Java
posts - 114, comments - 196, trackbacks - 0, articles - 0
BlogJava
首頁
新隨筆
聯系
管理
聚合
JavaScript 中的繼承(上)
Posted on 2006-11-28 22:51
Jaunt
閱讀(212)
評論(0)
編輯
收藏
所屬分類:
JavaScript
作者:
Flyingis
原載:
http://www.aygfsteel.com/flyingis/archive/2006/07/15/58290.html
??? 繼承是面向對象語言基本特征之一,通過繼承可以將父類所具有的特性遺傳到子類。ECMAScript中的繼承不像Java、C++等語言那么明顯,直接通過關鍵字來實現,通常它是通過模擬方式來實現繼承功能的,并且實現方式有多種。
??? 在繼承中引入this關鍵字,使用構造器方法定義類來實現繼承。一個構造器是一個函數,因此可以將父類的構造器作為子類的一個方法使用并進行調用。
?
function
ClassA(id)
?
{
??
this
.id
=
id;
??
this
.sayId
=
?
function
()
{
???? alert(
this
.id);
?? }
;
}
?
function
ClassB(id,?name)?
{
??
this
.newMethod
=
ClassA;
??
this
.newMethod(id);
??
delete
?
this
.
newMethod;
??
this
.name
=
name;
??
this
.sayName
=
?
function
()
{
???? alert(
this
.name);
?? }
;
}
??? 注意,子類中所有新的屬性和方法都必需在刪除newMethod后引入,否則,可能存在用父類的屬性和方法重寫子類屬性和方法的危險。另外,使用這種方法還可以實現多重繼承,此時如果兩個父類具有相同的屬性或方法時,最后的類具有優先級。由于這種繼承方法比較流行,ECMAScript第三版引入了兩個 Function對象:call()和apply()。
???
call()
??? call()方法是最接近上述繼承方式的方法,它的第一個參數是this指向的對象,所有的其他參數都直接傳到function。
?
function
sayMessage(first,?last)
?
{
?? alert(first
+
?
this
.logic
+
last);
}
;
var
obj
=
new
Object();
obj.logic
=
?
"
or
"
;
sayMessage.call(obj,
"
Coffee
"
,?
"
Tea
"
);??
//
輸出"Coffee?or?Tea"
??? 用call()方法來實現繼承,只需要this.newMethod相關的三行代碼。
?
function
ClassB(id,?name)
?
{
??
?
//
this.newMethod?=?ClassA;
??
//
this.newMethod(id);
??
//
delete?this.newMethod;
??ClassA.call(
this
,?id);??
//
this指向ClassB的對象
??
this
.name
=
name;
??
this
.sayName
=
?
function
()?
{
???? alert(
this
.name);
?? }
;
}
???
apply()
??? apply()方法需要兩個參數:this所指向的對象,和傳到function的由參數組成的array。
function
?sayMessage(first,?last)??
{
??alert(first?
+
?
this
.logic?
+
last);
}
;
var
?obj?
=
?
new
?Object();
obj.logic?
=
?
"
or
"
;
sayMessage.apply(obj,?
new
?Array(
"
Coffee?
"
,?
"
?Tea
"
));??
//
輸出"Coffee?or?Tea"
??
??? 同樣,使用 apply() 實現繼承可以通過如下方法實現。
function
?ClassB(id,?name)?
{
??
//
this.newMethod?=?ClassA;
??
//
this.newMethod(id);
??
//
delete?this.newMethod;
??ClassA.apply(
this
,?
new
?Array(id));??
//
this指向ClassB的對象
??
this
.name?
=
?name;
??
this
.sayName?
=
?
function
()?
{
????alert(
this
.name);
??}
;
}
??? 當父類構造器的參數和子類構造器參數的順序一致時,可以使用子類的arguments對象作為第二個參數。否則,必需創建一個array來傳遞參數,或是使用call()方法。
???
文章待續……
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Javascript 如何實現對象的拖動?
對google個性主頁的拖拽效果的js的完整注釋
判斷Checkbox和Radio的一種方法
JavaScript,等比例縮放圖片的函數
setInterval全面的介紹(轉)
用javascript進行拖拽
[下載]JavaScript權威指南(第五版)
發現一個有用的js事件onpropertychange
JS中的setTimeout和setInterval的區別
javascript小技巧(收藏)
<
2006年11月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(2)
給我留言
查看公開留言
查看私人留言
隨筆分類
(114)
Adobe Flex(1)
Database(5)
Emacs(1)
html&css(1)
Ibatis(1)
JavaScript(21)
Linux/Unix(2)
seo優化(2)
主流Ajax(11)
健康生活(6)
另一種人生(程序人生)(8)
咖啡Java(21)
拾貝人生(20)
管理哲學(6)
經典C++
設計模式(java)(4)
軟件工藝(4)
相冊
My College
Friend's blogs
Ducky Yazy's blog
當當網圖書
當當網購物
樺清科技
樺清科技,是集網站優化、網站建設、IDC服務等于一體的網絡服務公司。
有只企鵝叫Linux
Fedora
Linuxfans
LinuxSir
有本經典叫C++
boost.org
有杯咖啡叫Java
Java Open
Java World
最新隨筆
1.?什么是客戶轉化率?
2.?一個成功網站必須擁有的技術
3.?九個抗電腦幅射方法
4.?養成喝水的好習慣
5.?長期伏案工作的頸椎保健
6.?管理故事:一條褲子
7.?46個不可不知的常識
8.?窮人的習慣
9.?李嘉誠給年青商人的98條忠告
10.?關于工作與人生的精辟哲理
搜索
積分與排名
積分 - 78911
排名 - 709
最新評論
1.?1[未登錄]
151321
--1
2.?re: [下載]JavaScript權威指南(第五版)
謝謝分享
--啊啊啊啊啊啊啊啊啊啊啊啊
3.?re: [下載]JavaScript權威指南(第五版)
發順豐
--shiyinlong
4.?re: [下載]JavaScript權威指南(第五版)
謝謝分享!!
--camado
5.?re: [下載]JavaScript權威指南(第五版)[未登錄]
where is it?
--kk
閱讀排行榜
1.?[下載]JavaScript權威指南(第五版)(8492)
2.?認識for…in 循環語句(7850)
3.?c:forEach標簽的使用(3540)
4.?ibatis中sql in語句的配置(3478)
5.?對事業的定義(3032)
評論排行榜
1.?[下載]JavaScript權威指南(第五版)(170)
2.?設定屬性rel為external與internal的不同(4)
3.?人生少走彎路的十條忠告 (3)
4.?c:forEach標簽的使用(3)
5.?如何將字符串或者數字轉換成大寫貨幣(3)
Copyright Jaunt.
主站蜘蛛池模板:
高邑县
|
罗田县
|
稻城县
|
宁安市
|
含山县
|
宜城市
|
长春市
|
盈江县
|
新丰县
|
洪洞县
|
石楼县
|
太湖县
|
利津县
|
南充市
|
沐川县
|
马公市
|
桑日县
|
丰都县
|
和田市
|
北海市
|
遂宁市
|
洪泽县
|
密云县
|
申扎县
|
亳州市
|
彰化县
|
秭归县
|
涿鹿县
|
汉阴县
|
德惠市
|
资兴市
|
白山市
|
达日县
|
泰和县
|
崇信县
|
兴国县
|
宜城市
|
营山县
|
商南县
|
进贤县
|
清原
|