Fixjs——javascript实现类继承、多态

<sdt id="89512093" sdtgroup="t" contentlocked="t" sdtlocked="t"><span lang="EN-US" style="font-family:'Calibri','sans-serif';font-size: 1pt; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><sdtpr></sdtpr><sdt id="89512082" title="文章标题" storeitemid="X_E9918D03-8E28-4028-9B69-989A4FE1BAE6" text="t" docpart="89512082" xpath="/ns0:BlogPostInfo/ns0:PostTitle"></sdt></span> </sdt>

前言

Javascript是一门非常灵活的语言,也是使用最广的动态脚本语言,框架、组件库也非常多。

JQuery是使用最广泛的js库之一,它确实做到了write less,do more…

Extjs在企业应用的UI上使用得比较广泛,做管理软件时用到的控件基本都涉及到了。还有许多优秀的js框架不一一列举。

Fixjs介绍

Fixjs是我打算在javascript技术领域开始积累的一个框架项目,这套框架主要为开发复杂组件提供底层的框架支持。何为复杂组件,请问使用JQueryExtjs开发一个ExcelPowerpoint的难度如何?

复杂组件需要面向对象

在控件、组件等UI的开发领域,面向对象的概念是非常重要的,组件的创建与销毁,规范接口,代码节省与复用等等。

以下是javascript实现继承与多态的例子

//定义通用Obj基类,这个基类定义initdispose方法用于解决初始化和资源释放

Obj = function() {

};

Obj.prototype = {

init: function () {

trace("Obj.init...");

},

dispose: function() {

trace("Obj.dispose...");

}

}

Obj.prototype.constructor = Obj;

varobj1 = new Obj();

obj1.init();

obj1.dispose();

trace("=====================");

// Person类继承与Obj,并重写initdispose

Person = function () {

};

//以下3行时实现面向对象的关键

Person.prototype = newObj();//Person继承于Obj

Person.prototype.constructor = Person;// 修正Person的构造函数为Person

Person.base = Obj.prototype;// 类能够通过base访问父类的方法

Person.prototype.init = function (name, sex, id) {

Person.base.init.call(this);//根据实际需要是否调用基类的init函数

trace("Person.init...");

};

Person.prototype.dispose = function () {

trace("Person.dispose...");

Person.base.dispose.call(this); //根据实际需要是否调用基类的init函数

};

varp = new Person();

p.init();

p.dispose();

trace("=====================");

//根据实际需要是否调用基类的dispose函数

Employee = function () {

};

Employee.prototype = newPerson();

Employee.prototype.constructor = Employee;

Employee.base = Person.prototype;

Employee.prototype.init = function (name, sex, id) {

Employee.base.init.call(this);

trace("Employee.init...");

};

Employee.prototype.dispose = function () {

trace("Employee.dispose...");

//这里不调用父类的dispose函数

};

vare = new Employee();

e.init();

e.dispose();

trace("=====================");

输出结果

Obj.init...

Obj.dispose...

=====================

Obj.init...

Person.init...

Person.dispose...

Obj.dispose...

=====================

Obj.init...

Person.init...

Employee.init...

Employee.dispose... 这里不调用父类的dispose函数所以只有一行输出

=====================

上面的例子已经基本实现了对象的继承与派生后的多态特性,不足的是:init函数不会自动调用,实现继承时的代码比较复杂,dispose缺少多次调用时的处理。

Fixjs中的面向对象实现

fixjs = {};

fixjs.VERSION = "1.0.0";

// fixjs.Class用于简化继承的实现代码,并自动执行init函数,思路参考jClass

(function () {

//当前是否处于创建类的阶段

var initializing = false;

fixjs.Class= function () { };

fixjs.Class.extend= function (prop) {

//如果调用当前函数的对象(这里是函数)不是Class,则是父类

varbaseClass = null;

if (this!== fixjs.Class) {

baseClass = this;

}

//本次调用所创建的类(构造函数)

function F() {

//如果当前处于实例化类的阶段,则调用init原型函数

if(!initializing) {

this.init.apply(this, arguments);

}

}

//如果此类需要从其它类扩展

if (baseClass){

initializing = true;

F.prototype = newbaseClass();

F.prototype.constructor = F;

F.base = baseClass.prototype;

initializing = false;

}

//新创建的类自动附加extend函数

F.extend = arguments.callee;

//覆盖父类的同名函数

for (var name inprop) {

if (prop.hasOwnProperty(name)) {

F.prototype[name] = prop[name];

}

}

return F;

};

})();

/*

fixjs.Object

提供对象初始化释放控制接口

*/

fixjs.Object = fixjs.Class.extend({

init: function () {

this.disposed = false;

trace("fixjs.Object.init...");

},

dispose:function () {

if (this.disposed) //通过this.disposed控制资源释放,确保只调用1

return;

this.disposed = true;

this.disposing();

},

disposing:function () {

trace("fixjs.Object.disposing...");

}

});

以下是用fixjs实现的继承例子

Person = fixjs.Object.extend({

init: function (name, sex) {

Person.base.init.call(this);

trace("Person.init...");

},

disposing: function() {

trace("Person.disposing...");

Person.base.disposing.call(this);

}

});

varp = new Person();

p.dispose();

p.dispose();//内部已经作了控制,能够多次调用资源释放dispose

trace("=====================");

Employee = Person.extend({

init: function (name, sex, id) {

Employee.base.init.call(this);

trace("Employee.init...");

},

disposing: function() {

trace("Employee.disposing...");

//这里不调用父类的disposing函数

}

});

vare = new Employee();

e.dispose();

e.dispose();

e.dispose();

trace("=====================");

输出结果

fixjs framework 1.0.0

fixjs.Object.init...

Person.init...

Person.disposing...

fixjs.Object.disposing...

=====================

fixjs.Object.init...

Person.init...

Employee.init...

Employee.disposing...

=====================

相关文章

Fixjs专栏

作者推荐

MyReport一款非常实用的报表引擎插件,提供Web报表设计、展现、打印、导出等功能集,集成简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值