您的位置:首页 > Web前端 > JavaScript

EasyJS 教程五 - 抽象方法以及覆盖方法的调用

2013-04-20 12:21 197 查看
我个人认为抽象是OOP的关键核心之一,通过抽象,可以把系统变的更加灵活,更加容易扩展。一个优秀的架构师可以通过抽象具体的业务,打造一个易于扩展的系统,当然,这一切依赖于架构师的经验和对系统的了解程度,一个优秀的架构可以令事半功倍的效果,当然,一个差的架构也会令公司陷入沼泽地。我从业20年来,大大小小的项目也有几十个了,无论是成是败,都从中学到了很多宝贵的经验。好了,不多说了,继续谈如何做EasyJS中使用抽象方法。事实上,JS是不提供抽象方法的,我们只能采用在父类建立空函数的方法来实现,当然,也可以用以下的方式

this.method1 = function() {
throw new Error("Please implement it in subclass.");
}


来放置系统的错误调用。

其实,很多其他的JS-OOP类库也提供重载的机制,但是最困难的情况是无法建立抽象方法,在父类中调用子类的方法。我现在的公司采用的jsoop,一个很小但是使用率很高的oop类库,当时我们用这个类库开发的时候,经常会出现这样的情况,但是无法实现。

比如 ClassA 中有方法 m1, m2, m3. ClassB继承于ClassA,其中override了m2, m3. jsoop将为classB建立m1继承于ClassA。虽然jsoop也可以实现在重载类中调用父类方法,比如

m2: funciton() {
......
super.m2();
......
}


但是,如果在ClassA的m2中,我们有这样的方法

classA:

m2: function() {
......
this.m3();
......
}


在通常的OOP中,我们期望的是调用实际的m3,但是在JSOOP中无法实现,使得不得不用一下非常的方法实现,是的代码变得非常的丑陋并且很难维护。

在EasyJS中,非常简单的实现了方法中的调用转换及设置抽象方法。

这个是另外一个类 Bar

/app/com/fern/bar.js

(function() {
var bar = function() {
var self = arguments[0] || this;
var _super = ExtendClass(this, JsLibrary.classForName("com.fern.BaseFoo"), self);
var p = 30; //This is a private variable
this.getValue = function() {
return p;
};

this.sayHello = function() {
console.log("Hello from Bar");
};
};
JsLibrary.import("com.fern.BaseFoo", function() {
JsLibrary.register("com.fern.Bar", bar);
}, function(err) {
throw err;
});
})();




通过开发窗口,我们import Bar并且创建一个实例。

在bar的代码中,并没有showValue这个函数,bar的showValue实际继承于BaseFoo. 当调用c.showValue的时候,

this.showValue = function() {
showBaseValue();
console.log("The value is: " + self.getValue());
};


首先执行的是showBaseValue,所以输出p = 10,之后调用显示getValue(),这个时候,代码将返回到Bar中执行,返回30,所以接下来会打印30.

当调用public方法的时候,最重要的是不要使用this关键字,如果使用this,代码无法返回到子类完成子类的代码,必须使用self来处理。感兴趣的读者可以使用this来替代self,看看执行的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐