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

我个人认为抽象是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,看看执行的效果。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值