WEB开发网
开发学院网页设计JavaScript javascript面向对象之我解 阅读

javascript面向对象之我解

 2010-09-14 13:32:52 来源:WEB开发网   
核心提示: 这里和大家讨论一下其中几个“高级”用法,一是prototype={...}的用法,javascript面向对象之我解(7),前面说过prototype也只不过是一个对象而已,当然任何一个对象都可以赋值给它,因为父类可能必须参数初始化;这里给出我的初步实现,还没有深入

这里和大家讨论一下其中几个“高级”用法。一是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、子类的构造函数中必须调用父类的构造函数,因为父类可能必须参数初始化;

这里给出我的初步实现,还没有深入测试,供参考。

上一页  2 3 4 5 6 7 8  下一页

Tags:javascript 面向 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接