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>
posted @ 2008-05-12 15:40 镜涛 阅读(1317) 评论(7)  编辑 收藏 所属分类: XML与XSLTAJAX

  回复  引用  查看    
#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 (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-12 15:47 编辑过
 
另存  打印
最新IT新闻:
· 《福布斯》:暴雪的新一波完美风暴已经到来
· 中国互联网公司在哪儿
· 微软:Silverlight内容也可被搜索引擎检索
· 内置AI技术 三星聪明微波炉还能上网
· 盛大设文学公司 原新浪博客负责人侯小强任CEO