这里我要说的重载(override),确实就是传统OO中的重载,而不是我们在JavaScript对象中对其同名属性或方法的重写(rewrite)。在此我就不详细讲什么是OOP中的override了,因为只要是使用.NET来编程的程序员都应该很了解的。
在我们的附加继承法的核心代码中:
不过由于我们保留了对基类实例的引用this.base = base;,所以即使在子类中被rewrite的方法,基类中仍然可以使用this.base.MethodName()来访问。这个调用基类方法的语句已经和C#中的override后调用基类方法非常的相似了
这个override最大问题是什么呢?就是它只能支持对子类中,没有使用同样override方法的方法进行这种override。好绕口,看看下面这个实例就知道问题了:
三个类grandpa、father和son,它们分别具有两个属性和两个方法。其中的getName方法,是从father中调用了grandpa中被override的同名方法,然后又从son中的getName调用了father中被override的同名方法。这样就在执行son中的getName时,在father中的getName方法中产生死循环,最后stack overflow,IE crash
由于JavaScript的OOP始终是在做一些模拟的工作,除了能实现某些模拟出来的功能外,同时实现模拟的代码的复杂度也是应该考虑的,像这样的override从代码实现上看非常的轻量级,而且也是很容易理解的。同时可以满足绝大多数的JS控件的开发,随后我会再给出一个ListView控件的事例,它的实现完全基于'附加继承法'和我这篇文章中所讲到的'重载'技术。
非常欢迎您的宝贵意见和建议,让我们开发的更好(copy了dudu的语录:)。
Attention:运行代码alert(s.getName())一定要关闭其它的IE,或避免正在任何IE中填写表单。