Javascript实现OO编程方面,由于语言本身的问题,目前还不能做到像Java及C++那样纯粹的OO编程。其中怎样实现继承关系是一个难点。通常认为通过prototype是一个比较理想的方式,还可以利用Javascript的动态特性,实现动态修改继承关系。代码如下所示:
function CBase(attr1) {
this.setAttr1 = function(attr1) { m_attr1 = attr1; }
}
function CExt(attr1, attr2) {
}
CExt.prototype = new CBase;
在使用上述代码时,可以实现子类继承父类的公共接口。但是这种方法有两大缺点:其一是无法实现protected属性及方法的继承,其二是父类中的属性,只有一个实例,供所有子类的实例共享,这时一旦更改父类的属性,将影响所有子类对象。对于第二点缺陷,显然是不能忍受的。
虽然还可以利用Javascript中的各种高级特性来实现完整意义上的继承,但是实现的复杂度太高效率过低,只具有理论上的意义,本人在这里提出一种简单的实现方式。代码如下所示:
function CBase(attr1) {
}
function CExt(attr1, attr2) {
}
从上面的代码可以看出,我们在子类中建立了一个父类对象,所有对父类方法的调用,都是通过对父类对象调用来实现。这样可以解决上面提到的两个问题,但是缺点是需要对父类的所有公共接口进行包装,编写复杂执行效率稍有降低,但是在大多数情况下还是可以使用的。