基于ECMAScript5的继承链实现
记得以前写过一篇基于javascript function的类继承链实现。在ECMAScript3.1中,可以把function模拟成类。但是,因为原型链,构造体的实现非常繁琐。
现在各大浏览器升级到ECMAScript5之后,逐渐抛弃了以function来模拟类的思路。而转变为以对象来模拟类的思路。即:
?
?
?大致功能为为对象增加getInstance方法和父类的superclass对象使其能够调用父类的构造体和方法。
?
测试:
?
?
可以很明显的看到instanceof可以判断原型链上的function。
var Animal = Class({ eat: function() { throw new Error('interface...'); };});var Dog = Class(Animal, { eat: function() { return 'dog eating food'; };})var Cat = Class(Animal, { eat: function() { return 'cat eating fish'; };})function animalExecute(animal) { // 接口检查 //Interface.ensureImplements(animal, Animal); animal.eat();}
关于接口及接口检查的实现,请光临在下的小坦克(tank/js/util.js),希望大家多多交流,共同进步。
呵呵,实际在实现继承的时候,特别是在用装饰模式的时候。完全的装饰类是很少有的。子类总会多几个方法。
你的这个实现是多态。而我这个只是用来代替instanceof的思路。。目的不一样。。 3 楼 danny.chiu 2011-05-18 呵呵,我只是面向接口的思路,如果说到您的用实例方法代替instanceof的话,还不如直接给类定义个属性(this.instanceof = 'className'),这样倒也可以一致了。如果非用您那种思路,首先判断变复杂了,没有统一的接口,必须知道对象的具体实现,其次给重构带了诸多陷阱,比如不能随便删除方法;不能随便修改方法名字;不能随便添加方法,因为需要看下其他同父子类是否有同名的方法,不然你的判断就失效了。
PS:其实真的可以在实现的时候,像superclass一样,添加一个instanceof的属性。 4 楼 rainsilence 2011-05-18 danny.chiu 写道呵呵,我只是面向接口的思路,如果说到您的用实例方法代替instanceof的话,还不如直接给类定义个属性(this.instanceof = 'className'),这样倒也可以一致了。如果非用您那种思路,首先判断变复杂了,没有统一的接口,必须知道对象的具体实现,其次给重构带了诸多陷阱,比如不能随便删除方法;不能随便修改方法名字;不能随便添加方法,因为需要看下其他同父子类是否有同名的方法,不然你的判断就失效了。
PS:其实真的可以在实现的时候,像superclass一样,添加一个instanceof的属性。
最后一句话的确有点道理。。但是我最后的解决方案只是针对上面的java代码实现的功能而言的。(意思为,如果非要实现这样的代码,你也可以这样写)一般架构而言,都应该写成接口的形式。但是基于产品的高度来考虑,总会有人关心没有了instanceof会怎么样?By the way,一般前端ui架构核心主要是合成模式。只需要定义个接口合成就ok了。也不会用到上面instanceof的情况。
ps.直接给类定义个属性(this.instanceof = 'className')这样是不可取的,与其这样,不如isPrototypeOf。