javascript面向对象之我解
2010-09-14 13:32:52 来源:WEB开发网这里和大家讨论一下其中几个“高级”用法。一是prototype={...}的用法。前面说过prototype也只不过是一个对象而已,当然任何一个对象都可以赋值给它。后面的{...}可以理解成定义了一个匿名的类,然后直接实例化成一个对象,再赋值给prototype。二是Object.prototype.extend = function(object) {...}的用法。之前谈到prototype的陷阱时讲过,prototype的这一特性可以动态添加方法,这里就应用了这一特性。这里我有一点不明白,为什么使用return Object.extend.apply(this, [this, object])而不是return Object.extend(this, object)?感觉这两种方式没什么区别,因为Object.extend方法完全没有使用实例内部的任何属性,没有使用this引用。
我对这种实现的看法:
优点:
1、prototype的定义和extend方法可以任意使用,没有调用的次序约束。
2、由于extend方法实现得很巧妙,这种继承方法可以实现"多继承"。我不喜欢多继承,宁愿称其为mixin,因为这和ruby中的mixin很相似。
缺点:
1、不支持父类的构造函数;
2、不合适的方法覆写行为。按照这种设计,父类甚至可以覆写子类的方法。
我想,一个比较完善的js继承应该实现以下特性:
1、子类能够继承所有父类的方法和属性,包括内联定义的和prototype定义的;
2、有合理的覆写行为。子类可以覆写父类的方法和属性,而不是反过来。如果发生覆写,子类仍然应该保存对父类中被覆写的方法和属性的引用,因为子类的实现可能需要调用父类的实现;
3、子类的构造函数中必须调用父类的构造函数,因为父类可能必须参数初始化;
这里给出我的初步实现,还没有深入测试,供参考。
Tags:javascript 面向 对象
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接