prototype.js的扩展1.1版( 2006年11月)
即extend.js
Extend让您在JavaScript的应用中使用传统的单类继承(类似java语言). 它还提供很多先进的功能,如运行时类的重定义,反射和修改.
你可以下载1.1版(最新)在这里
http://www.ivy.fr/js/extend/extend.js
一个测试套件
http://www.ivy.fr/js/extend/extend-test.html
有什么创新的? * 1.1 ( 2006年11月) -Extend.js不依赖于Prototype.js,所以你可以将它用于任何项目. 它还包括一个新supercall (name, ... )方法,实现调用父类中定义的某一方法. 这等于super.name……
JavaScript语言存在的问题:因为它是基于原型的,所以没有提供一个默认的方式来处理继承. 但是有可能在JavaScript原型系统基础上做成传统OO式的继承形式.
著名的prototype.js提供了一个很基本的方法来创建类,如下:
var MyClass = Class.create()
var MyClass.prototype = {
attribute:value,
...
initialize:function(arg1,arg2,...) {
}
method:function(arg1,arg2,...) {
...
},
...
}
一个对象就可以轻易实例化,例如
var instance = new MyClass()
但有没有简单的方法实现MyClass的子类定义.
类似extendclass extendclassfurther的扩展提供了extend或者subclass设法解决这一问题,允许对一个存在的class继承. 这些扩展提供了一种机制,从父类调用方法(相当于super的语法) .
然而,这两个扩展没有一个灵活而可靠的super当量,造成的结果是高级JavaScript的应用软件开发非常困难.
此外,这两种扩展仍然不允许对类的元信息进行规范制定(如class name,methods,parent class等) , 这才是调试和反射开发中真正有用的要素.
解决办法:我们建议设立一个比较简单的OO层,由两部分构成组成:
*每个类增加额外的方法和属性,使得可以对类直接存储、操作元信息
*为每个实例化的对象提供本身和父类的存取访问器.
*提供一个简单的方式来获取和调用父类中定义的方法
类中的对象
className 字符串 类的名字(可未定义)
parentClass 类对象 是父类的引用(可未定义
constructor() 返回 类中定义的构造器
method(n) 根据名字返回定义的方法,或者抛出一个异常.
method(n,F) 根据名字用一个已有的函数来定义一个方法,也可以用来更新子类如果f是无效的方法是移除.
methods 字典 这个类中定义的方法.很少会用
inherited 字典 映射到类中定义的属性/方法名
issubclass (c) boolean 判断是不是一个类的子类.
reparent (c) 函数 修改父类. ,当你想一个对象改变类型,这是非常有用.
对象
getclass ( ) 类对象 返回对象的类
parentclass ( ) 类对象 返回对象的父类(如果存在)
parentcall (name, args……) value 价调用父类中定义的方法
特性:
*可作为传统prototype.js中class.create的替换功能
*灵活和可靠的仿super功能
*富足的类元信息,如列出类中定义的方法等
*动态reparenting ,允许改变现有类的父类
*动态类的改变,当你想要一个对象改变类。
用法
定义一个类:
是比较容易的, 类似class.create方法. 您只需指定classdef属性,如下:
var MyClass = Class.define({
CLASSDEF : {
name: 'MyClass'
},
attribute: ...,
method : function(...) {
...
},
...
})
主要区别是,因为定义时候的操作,以后你不能再改变myclass.prototype. 因此,如果你选择使用class.define你应该使用MyClass类对象的方法,实现类的操作(改变父类,添加方法等) .
定义子类:
可以用class.define操作. 您只需在classdef中加上父类定义
var MySubclass = Class.define({
CLASSDEF : {
name: 'MySubClass',
parent: MyClass
},
...
})
调用父类的构造函数:
在子类中调用父类的构造函数,可以这么做:
var MySubclass = Class.define({
...
initialize:function() {
this.parentClass().constructor().call(this)
...
}, ...
}
调用父类的一般方法:
如果MyClass定义了一个hello的方法,在mysubclass也定义的有hello方法,我们希望调用的是myclass的hello方法,我们可以这么做:
var MySubclass = Class.define({
...
hello:function() {
// This is the "old way of doing it"
// MySubclass.parentClass.method("hello").call(this)
this.parentCall("hello")
...
}, ...
}
改变父类:
假定你有classb ,继承classa ,你想在运行时classb继承classa . 这可以:
classb.reparent ( classa2 )
这会自动更新所有的classb , 使得classa2成为classb的新父类