整治javascript--面向对象编程

prototype.js的扩展1.1( 200611)
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 ( 200611) -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.jsclass.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方法,我们希望调用的是myclasshello方法,我们可以这么做:

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的新父类

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值