现在开始讲讲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解析器作了处理。