镜涛的家 JT
A NEW LIFE WITH YOU !
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 35 文章- 1 评论- 463
javascript继承的原理
通过对javascript的几种函数的运行分析,得出结论:
javascript 的继承实际上是通过对对象进行初始化来模拟的。
代码一:实现继承的一种方法
<
script language
=
"
javascript
"
type
=
"
text/livescript
"
>
function Person()
{
this
.say
=
function()
{alert(
"
Name
"
)}
;
}
function PersonA()
{
this
.say
=
function()
{alert(
"
windowSay
"
);}
;
}
PersonA();
//
对window对象添加方法
window.say();
//
显示windowSay
var Me
=
{}
;
Person.call(Me);
Me.say();
//
输出结果为Name,可以得出Me通过Person.call(Me)“继承”了say方法
</
script
>
对比:
<
script language
=
"
javascript
"
type
=
"
text/livescript
"
>
function Person()
{
}
Person.say
=
function()
{alert(
"
Name
"
)}
;
var Me
=
{}
;
Person.call(Me);
//
Me.say();
//
输出object doesn't support this method or property!我们可以看到Me并没有“继承”Person的say方法
</
script
>
为什么呢?
原因是第一种方法执行Person.call(Me)时,将Person里的this指定为Me,然后执行Person方法里的代码
显而易见,
this
.say
=
function()
{alert(
"
Name
"
)}
;这句话对Me添加了方法。让Me对象具有了say的行为。
而PersonA();时,要执行PersonA里面的代码,此时this对象代表window,所以window获得了say行为。
而第二种方法执行Person内部的代码,所以并没有给Me添加行为,调用Me.say()自然出错。
如此看来通过Call,Apply,
for
(property
in
object
),prototype等方法实现继承时,只是一种模拟继承的
方式。具体过程就是对一个对象动态添加函数,属性。
Person.call(Me);是对Me添加Person的属性方法,哪么function Person()
{alert(
"
Name
"
);}
面对的对象是谁呢?
我们通过例子来说明
<
script language
=
"
javascript
"
type
=
"
text/livescript
"
>
window.name
=
"
Window
"
;
function Person()
{
alert(
this
.name);
}
window.Person();
//
显示Window
Person();
//
显示Window
</
script
>
可见我们定义在script标签里的函数实际上是对window对象的操作,我们给window对象添加了方法和属性
我们再来看看
<
script language
=
"
javascript
"
type
=
"
text/livescript
"
>
function Person(thing)
{
this
.say
=
function()
{alert(thing);}
;
}
var Me
=
{}
;
Person.call(Me,
"
thing
"
);
Me.say();
//
输出thing
window.Me.say();
//
输出thing
//
window.Person.say("Person");
//
输出object doesn't support this method or property!
</
script
>
我们可以看到对象Me定义在script标签内,也是window对象的一个变量,同时它又通过call获得了say方法的copy
而Person作为方法,虽然在其内定义了一个say方法,而Person并没有得到say的copy,要想让Person能say哪么可以
new
Person(),或者Person.call(Person)。new的过程就是将Person内的this设为Person并且添加行为的过程。
如下:
<
script language
=
"
javascript
"
type
=
"
text/livescript
"
>
function Person(thing)
{
this
.say
=
function()
{alert(thing);}
;
}
var Me
=
{}
;
Person.call(Me,
"
thing
"
);
Me.say();
//
输出thing
window.Me.say();
//
输出thing
Person.call(Person,
"
person
"
);
Person.say();
//
输出person
window.Person.say();
//
输出person
var p
=
new
Person(
"
person
"
);
p.say();
//
输出person
window.Person.say(
"
Person
"
);
//
输出person
</
script
>
Tag标签:
继承
,
javascript
,
new
,
call
posted @ 2008-05-12 15:40
镜涛
阅读(1317)
评论(7)
编辑
收藏
所属分类:
XML与XSLT
、
AJAX
发表评论
回复
引用
查看
#1楼
2008-05-12 21:29 |
风景年华
踩过,顶一下
回复
引用
查看
#2楼
2008-05-13 04:50 |
梁逸晨
强帖!
等李战来评论。
回复
引用
查看
#3楼
2008-05-13 14:08 |
疯狂的程序员 [未注册用户]
李战在抗震啊 没空哦
回复
引用
查看
#4楼
2008-05-18 14:46 |
入江纱绫 [未注册用户]
学习!
回复
引用
查看
#5楼
2008-05-19 16:50 |
小城blog [未注册用户]
学习学习
回复
引用
查看
#6楼
2008-05-19 17:24 |
痴情客
写的很乱 ,最有用的 原型继承 ,你却没有说道
因此 这篇文章也谈不上什么 继承原理。
回复
引用
查看
#7楼
[
楼主
]
2008-05-19 17:58 |
镜涛
@痴情客
呵呵,原型继承也是通过给某个对象提供另一个对象的属性和行为来实现的。
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-05-12 15:47 编辑过
另存
打印
所属分类的其他文章:
·
javascript继承的原理
·
利用XML配置实体列表
·
多态的应用
·
学习XSLT(二)
·
学习XSLT(一)
最新IT新闻:
·
《福布斯》:暴雪的新一波完美风暴已经到来
·
中国互联网公司在哪儿
·
微软:Silverlight内容也可被搜索引擎检索
·
内置AI技术 三星聪明微波炉还能上网
·
盛大设文学公司 原新浪博客负责人侯小强任CEO
博客园新闻频道
博客园首页
社区
公告
QQ:307073463 Email:jingtaodeemail@qq.com MSN:sunjingtao@live.com
与我联系
发短消息
留言簿
给我留言
查看留言
我参加的小组
Visual Studio
设计模式
求职招聘小组
读书(Books)
web标准设计
AJAX
.NET 3.x
书籍推荐
博客园精华集出版小组
WinForms
我参与的团队
.NET 控件与组件开发(0/1321)
WCF技术研究团队(1/103)
asp.net开发团队(0/142)
框架设计团队(0/14)
随笔分类
(48)
.NET(12)
(rss)
AJAX(6)
(rss)
Game (1)
(rss)
Java(1)
(rss)
XML与XSLT(5)
(rss)
读书笔记(3)
(rss)
日常生活(9)
(rss)
数据结构与算法(1)
(rss)
项目开发(5)
(rss)
重构与模式(5)
(rss)
相册
ME
我的好友
冬冬
(rss)
IT的老大,我们的biang
小刚
(rss)
天天一起的哥们
最新随笔
1. 举国默哀三天
2. javascript继承的原理
3. Ajax-Request
4. “做”的“累”
5. Html元素动态添加方法
6. 书籍下载链接
7. 分享书籍之汗
8. Div+Css登陆窗体实现
9. 分享书籍
10. 利用XML配置实体列表
搜索
积分与排名
积分 - 69288
排名 - 530
最新评论
1. re: “做”的“累”
设计模式,先做好设计,挨着,一步步来,要不看看xp拥抱变化 也行,就是极限编程.....哈哈...放轻松点....慢慢体会乐趣.....
(林间曦阳)
2. re: “做”的“累”
设计模式,先做好设计,挨着,一步步来,要不看看xp拥抱变化 也行,就是极限编程.....哈哈...放轻松点....慢慢体会乐趣..... (林间曦阳)
3. re: 神界危机3.4通关方略
擦 真JB好过。。 打了5个小时还JB弄的满身是汗,, 够JB累的了。。 有那时间都能操次逼了。。 妈的 完人。。不学分身跟死亡之指根本过不去。。 要不得他吗的打上一天时间... (我中国人 找回公道)
4. re: 浅谈JSON和XML
第一个……悄悄的说不是json哦…… (棕熊)
5. re: 举国默哀三天
在通过css定制中写上:
body * {filter:gray} (天使の泪)
阅读排行榜
1. 神界危机3.4通关方略(2565)
2. 分享书籍(2546)
3. 知识的殿堂??!(2507)
4. 分享,讨论Programming的习惯(2356)
5. 解决Ajax中文乱码问题(2281)
评论排行榜
1. 分享书籍(162)
2. 知识的殿堂??!(57)
3. 分享,讨论Programming的习惯(32)
4. 书籍下载链接(24)
5. 扯淡设计模式之单件模式(23)