铁匠

做人要低调
随笔 - 133, 评论 - 255 , 引用 - 184

导航

公告

文章分类

存档

随笔分类

相册

BLOG

网站

论坛

JS的继承机制

现在开始讲讲JS的继承机制,首先让我们来看一下它的继承实现过程:
function BaseClass()
{
BaseClass.prototype.HelloWorld = function()
{
  alert("hello world from base");
}

BaseClass.prototype.GoodBye = function()
{
  alert("good by from Base");
}

}

function ClassA()
{
ClassA.prototype.HelloWorld = function()
{
  alert("hello world from ClassA");
}
}

ClassA.prototype = new BaseClass();

可以看出来,JS里面没有关键字class,而是用一个function来说明它是一个对象,无论怎么说都是让人很难于接受它可以封装对象的事实。它的继承机制是通过它的prototype(原型)来实现的,每个function都有一个prototype,很让人迷惑的一个东西,不知道我们是把函数当对象用,还是把对象当函数用了。
它的继承是通过上面代码的最后一句来实现的:ClassA.prototype = new BaseClass(); 注意这里基类会进行一次初始化,所以当我们要是在构造函数里面实倒一些对象的时候,要注意了,千万不要在这里去操作整个页面的DOM,不然可能会造成重复操作。按这样写我想很多人(包含我)已经完全晕了,为什么可以实现继承:new BaseClass()的时候,这个类已经实现成为一个对象,而把这个对象的指针赋给了另一个类的prototype,按照正常编程语言的逻辑已经无法理解了。不过查了些资料,这个prototype想当于是Delphi的class method/class function,而基类实现的是以一个单件的形式来赋给子类的。
再调用测试例子
var obj = new ClassA();
obj.HelloWorld();
obj.GoodBye();
我们得到obj.HelloWorld(),并不是按我们以前所想到的先"hello world from base"再"hello world from ClassA",只有"hello world from ClassA",所以在JS里面的对象继承只能是完全覆盖父类的方法来实现,只能实现有限的对象继承机制。
至于为什么ClassA.prototype = new BaseClass()后,还可以保留ClassA中的HelloWorld方法,这个到现在为止,我还是没有想清楚,只能是猜测JS解析器作了处理。

发表于 2006年6月23日 17:17

评论

# re: JS的继承机制

你会清楚的
再调用obj.GoodBye();的时候
首先会在
ClassA中查找
GoodBye方法
如果没找到则会向
ClassA的prototype 中查找(也就是BaseClass中找)

如果再找不到
则会向BaseClass的prototype中查找...

形成一条链子....
2006-9-4 18:50 | 毕竟红尘

# re: JS的继承机制

然后把
function BaseClass()
{

}

的定义方法理解为构造函数

就不会纠缠在 是函数还是 object...

(请留意,gzit论坛--------问题不过夜的论坛)
http://bbs.gzit.org/index.php?fromuid=8 http://bbs.gzit.org/register.php?fromuid=8
2006-9-4 18:56 | 毕竟红尘

Post Comment

主题  
姓名  
主页
校验码  
内容   
京ICP备 05050892号