English | 简体中文 XML | HTML | | |
ESOE 首页
文档

ESOE 技术说明书 0.2

ESOE是ECMAScript OO Engine (ECMAScript面向对象引擎)的简写

版权声明
Feng WeiGuo
forxm@21cn.com
http://www.viviasoft.com

2006-8
概述
本技术说明书描述一种基于ECMAScript(第三版)的面向对象方法.
术语
本节列出在ESOE中所使用的术语. 术语的说明指示的是在本文中表示的含义, 而非通常意义上的严格的含义.
名称空间 (Name space)
名称空间用于指示一个对象相对于另一个参照对象的位置. 名称空间可用一组对象链来表示, 或用这些对象的名称链表示.
全局名称空间 (Global name space)
参照对象是全局对象GLOBAL的名称空间.
包 (Package)
指名称空间对象链中的一个子对象, 特指可以添加对象链下级子对象的子对象.
构造器 (Constructor)
函数对象 (Function Object).
原型 (Prototype)
一个构造器的原型对象.
类 (Class)
一组构造器和其原型的集合. 在ESOE中, 类也用于特指构造器的原型.
声明 (Declare)
要求构造器预备好它的原型.
声明函数 (Declare fucntion)
构造器的一个方法, 用于完成声明工作.
规范化 (Normalize)
将已声明的构造器加载到一个名称空间. 已规范化的类可以使用.
预规范化 (Pre-Normalize)
将未声明的构造器加载到一个名称空间. 预规范化的类还未能使用.
导入 (Import)
将已规范化的类映射到另一名称空间.
继承 (Derive)
一个类继承自一个基类 (Derive a class from a base class).
基类 (Base class) 和继承类 (Derived class)
继承关系的两端.
载入 (Include)
将类库文件或类文件加载到系统.
共享 (Share)
在多个全局GLOBAL对象运行环境下共享同一个ESOE对象及其类库.
内存泄漏 (Memory leakage)
在某些不完善的ECMAScript实现系统中, 系统无法释放已无用的内存, 导致系统内存占用不断增大的现象.
循环引用 (Circular references)
指两个对象由于相互建立引用, 并在某些系统中造成内存泄漏.
闭包函数 (Enclosure function)
指在一个函数内构造另一个函数, 并在某些系统中造成内存泄漏.
清理函数 (Destroy function)
用于避免内存泄漏的方法.
ESOE应用系统 (ESOE Application)
使用ESOE引擎的应用系统/应用软件
ESOE模块 (Modules)
当前版本的ESOE依功能划分为6个模块 (modules)
特征说明
模块1
M1 : kernel
1. 名称空间定义
2. 类定义
3. 类继承定义
4. 规范化非ESOE对象方案
5. 关键字加载和冲突方案
6. 模块加载
7. 简单调试工具
1. 支持ECMA-262 (第三版)的兼容语言.
2. 手工加载类库和资源.
3. 应用系统的发行版可以转化到模块1提高载入效率.
模块2
M2 : resource
1. 名称空间的物理映射定义
2. 载入资源方案
模块3
M3 : loader
1. 自动载入类库和类1. 模块3依赖于模块2.
2. 模块3也允许手工加载类库和资源.
模块4
M4 : destroy
1. 清理函数方案1. 临时性模块.
2. 本模块可能与其它所有模块相关.
模块5
M5 : share
1. 共享ESOE对象
2. 共享类库
1. 模块1为核心功能.
2. 其它模块不是必须的, 可依照使用功能进行组合.
3. 对一些ECMAScript系统, 可能某些模块无法实现, 且模块中的某些功能无法实现.
4. 除模块3依赖于模块2外, 各模块可独立加载.
5. 模块4是临时性模块, 如果未来出现完善的ECMAScript系统, 不存在内存泄漏问题, 可以取消模块4.
惯例
1. 在ESOE中, 构造器和类(构造器的原型)都可用于指示类, 在对类的描述上属于同一级别.
2. 构建ESOE自身时, 所有属性都为可见属性.
名称惯例
$esoeESOE引擎
_property属性前缀 "_" , 全小写. 除 $esoe.ns 之外.
$property与文件载入相关的属性前缀 "$", 全小写.
_keywordc2/c4关键字前缀"_", 全小写.
$esoe.MyFunc()$esoe内部函数名称, 所有单词的第一个字符大写.
func略写, 函数/构造器 (Function).
ns略写, 名称空间 (Name Space), 一般指表示名称空间的字串.
pkg略写, 包 (Package).
关键字方案
关键字类别
ESOE关键字依使用方式分为4个类别 (Category)
类别关键字替代方案说明
c1$esoe
prototype._esoe
[object]._esoe
1. 如果c1关键字发生冲突, ESOE引擎将无法工作
c2_ns
_package
_normalize
_import
_derive
_derivex
_setpath (M2)
_getpath (M2)
_loadres (M2)
_update (M3)
$esoe.*1. 替代方案指将关键字替代为$esoe的对应方法. 如_package用$esoe._package替代.
2. 如果c2关键字发生冲突, 可使用nokey参数关闭这些关键字, 并使用替代方案.
3. 在应用系统的发行版, 如果要兼容非ESOE系统, 最好使用替代方案.
c3prototype._base
prototype._pkg
prototype._esoe.*1. 替代方案指将关键字替代为prototype._esoe的对应属性. 如_base用_esoe._base 替代.
2. 对ESOE对象, c3关键字等同c4 关键字, 应由用户主动避免冲突.
3. 当规范化非ESOE对象时, 如果c3关键字发生冲突, 可关闭这些关键字, 并使用替代方案.
c4[func]._declare
prototype._set
prototype._destroy (M4)
prototype._share (M5)
$esoe.Share (M5)
1. c4 关键字只用于ESOE对象, 理论上不会发生冲突, 或应由用户主动避免冲突.
关键字简述
关键字说明
$esoe=window.$esoe, ESOE引擎自身
prototype._esoe用于维护类/对象信息
[object]._esoe用于维护非EOSE对象信息
_ns预定义一个名称空间, 获取一个名称空间.
_package等同_ns, 用于系统兼容
_normalize规范化构造器
_import导入一个类
_derive继承自一个类
_derivex多继承, 或属性拷贝
_setpath (M2)设置名称空间物理路径
_getpath (M2)获取名称空间物理路径
_loadres (M2)加载资源
_update (M3)更新导入的类. 使用这个关键字激活一些载入类库的工作, 例如循环操作等.
prototype._base基类, 即基类所对应的构造器的prototype.
prototype._pkg一个类所属的最底层的包.
[func]._declare构造器的声明函数
prototype._set类或实例的初始化函数
prototype._destroy (M4)类或实例的清理函数/析构函数
prototype._share (M5)类或实例的共享初始化函数
$esoe.Share (M5)为当前GLOBAL对象创建一个共享的ESOE对象.
ESOE引擎
ESOE布局
ESOE布局包括以下部分
1. 加载ESOE引擎及参数
2. 设置资源路径. 为可选部分.
3. 手工加载类库. 对M3为可选部分.
4. 加载和声明使用的类.

说明:
1. ESOE强烈建议将ESOE布局代码和用户代码分离, 将所有类声明集中放在代码项部. 虽然在多数环境中这并不是必须的.
2. 对M3, 如果使用了非ESOE类, 而且这些非ESOE类彼此间具有依赖性, 可以多次使用ESOE布局的第4部分.
被链接于: [Javascript 实现使用说明书] > [ESOE布局]
例子1, HTML/javascript, M1+M2
例子2, HTML/javascript, M1+M2+M3
例子3, HTML/javascript, M1+M2+M3+M5, 主ESOE对象
例子4, HTML/javascript, M1+M2+M3+M5, 共享ESOE对象
创建ESOE对象
ESOE对象由一空Object对象创建.
	window.$esoe= new Object;
ESOE对象参数
ESOE引擎具有可由外部传入的参数
_param保存所有参数以备将来使用.
_pathESOE引擎的物理路径
_module指示要加载的模块的字串, 可选的模块代码为1,2,3,4,5. 其中1为默认加载的核心模块, 可省略. 其它模块代码以','分隔.
例子:
"1"          M1 (默认)
"2"          M1+M2
"4,5"        M1+M4+M5
_debug调试级别参数, 当前版本可设为以下值,
0: 不调试 (默认)
1: 设置为最低的调试级别
9: 设置为最高的调试级别
_nokeyc2 关键字冲突列表, 如果设为'*', 禁用所有c2关键字.
_libpath (M2)默认类库加载路径, 只可设置1个. 如果未设置, 使用_path作为默认路径.
_libmode (M3)默认类库/类文件加载模式
0: 不加载任何默认类库/类文件 (默认).
1: 先加载默认类库文件, 再加载类文件.
2: 先加载类文件, 再加载默认类库文件.
3: 仅加载默认类库文件.
4: 仅加载类文件
说明:
1. 对实际的应用系统, 并非所有的加载模式都可正常工作, 应根据调试/发行/配置等具体情况进行设置.
_nodestroy (M4)在将来, 对于较完善的ECMAScript实现系统, 如果不存在内存泄漏问题, 可以关闭清理函数机制. 可选值, 0 (默认) 或1.
ESOE内部属性
ESOE引擎具有以下内部属性, 应用系统应尽可能避免直接操作ESOE引擎的内部属性.
内部属性
_idESOE引擎序号, 主引擎为1, 共享引擎依次递增.
_nextid用于产生_id的辅助变量
_global当前$esoe的全局环境
_main (M5)主引擎的全局环境
_track1. 用于记录M5创建的所有共享ESOE对象.2. 用于记录M4创建的所有须要清理的对象.
ns主名称空间根节点, 所有类库载入的位置
_lib用于保存ns物理映射和类库载入过程的名称空间
_lib.$count (M3)保存当前载入过程的已载入文件数量
_lib.$ext (M3)如果载入了一个默认类库文件或外部文件, 此属性设为1, 否则为0.
_trace用于保存调试信息的对象
$esoe._lib子项属性
每一个$esoe._lib名称空间节点具有以下属性
[item].$path保存由_setpath()所设置的路径
[item].$run用于记录类的加载状态, 以避免循环加载. 如类正被加载, 值加1, 如加载退出, 值减1
[item].$alone (M5)如共享类在主引擎加载, 设为0; 如在本地环境中被加载, 设为1
[item].$map (M3)保存由_import()所设置的全局名称空间.
[item].$inc (M3)保存一个类库/类文件已加载的次数
[item].$fail (M3)如果类不存在, 保存类的名称空间字串. 如果类已加载, 清除此属性.
名称空间
名称空间定义
名称空间是用对象链表示的对象位置的一种方法. 在ESOE中, 任何对象链都可被称为名称空间. 对象链的根节点必然是全局对象(GLOBAL)或某个指定对象的属性, 在ESOE中称这个对象映射(Map)了所有的这个名称空间.

例如:
var obj= new Object;
obj.com= new Object;
obj.com.mycompany= new Object;
obj.com.mycompany.myclass= new Object;

以上过程在obj对象中映射了("com", "com.mycompany", "com.mycompany.myclass")名称空间, 也可以称为是在obj.com对象中映射了("mycompany", "mycompany.myclass")名称空间, 以此类推. 特别地, 也可称为在GLOBAL对象映射了"obj.com.mycompany.myclass"名称空间.
包定义
在ESOE中, 包特指在名称空间中, 为构造下一级子对象所建立的空对象, 或者是可以构造下一级子对象的对象.

名称空间的每一个具有包概念的元素都必须是可以添加属性的对象, 如Object对象, Function对象, Array 对象等, 不可添加属性的对象不可以作为包对象, 如Number对象, String对象, Boolean对象, undefined, null等.

在ESOE中, 名称空间的末级对象是类的构造器, 但为了兼容加载非ESOE系统, 末级对象可以是其它任意可以添加属性的对象.
ESOE的名称空间 / _ns() / _package()
ESOE载入所有类库都映射于$esoe.ns.

根据用户的要求, 已载入的类库可以在全局对象(GLOBAL)下重新映射出另一名称空间并建立引用对象. 或者在用户自定义的对象中映射并建立引用对象.

_ns关键字也用于获取已存在的名称空间对象.

_package() 关键字与_ns() 完全相同, 方便与其它系统快速兼容.
类规范化 / _normalize()
规范化是将类的构造器映射到$esoe.ns的过程. 

在ESOE中, 对于每一个构造器 (函数), 如果它的原型 (prototype) 已预备好, 都可对它进行规范化操作. 预备好的原型指以后不会再出现对prototype的赋值操作, 但不包括对prototype的属性的操作. 例如, 规范化后, func.prototype= ...是不允许的, 但func.prototype.p1=...是允许的.

ESOE系统在映射之前, 将先检查名称空间是否有冲突. 如果名称空间已被其它对象占用, 规范化过程返回false, 如果$esoe._debug>0, 会显示一个出错信息.

如果映射成功, 系统会添加一个prototype._esoe属性到构造器的原型中.

另外, 类似ECMAScript系统, 规范化过程还会做以下工作,
	func.prototype.constructor= func;
如果_esoe._conflict不为1, 为方便用户使用, 规范化过程会做以下工作,
	func.prototype._pkg = func.prototype._esoe._pkg;


prototype._esoe 对象属性
_esoe._type标记对象类型, 1:  class, 2: object
_esoe._pkg类所属的最底层的包.
_esoe._conflict如果有c3关键字冲突, 设为1.
_esoe._nonesoe如果类是非ESOE对象, 设为1.
_esoe._shared (M5)如果类是共享对象, 设为1.
规范化非ESOE构造器
为了快速兼容现有的大多数系统, 可以将一个现存在类文件经过少许改动, 调用规范化过程将它映射到ESOE的名称空间. 

规范化非ESOE构造器不会设置prototype.constructor.
规范化非ESOE对象
现存的一些类库系统, 有可能使用了全局变量. 为了快速兼容这些系统, ESOE允许将任意可以添加属性的对象映射到ESOE的名称空间. 当映射非ESOE对象, _esoe属性直接添加到对象中. 

规范化非ESOE对象不会设置prototype.constructor.
名称空间的物理映射
可以将一个名称空间映射到文件物理路径. 名称空间中的每一个包对象映射为一个同名的文件夹, 每个末端类对象映射为一个同名的文件. 经过简单的转换后, ESOE系统可以确定从何处自动加载类库文件.

例如, 名称空间com.mysite.myclass可以映射到物理路径com/mysite/myclass.[扩展名].

另外, 为了提高加载效率, 每个包对应的文件夹下可以放置一个_all.[扩展名]的文件, 文件中包括这个包下所有直接的类库. 通过设置ESOE参数_libmode可以加载这个文件.
设置物理路径 / _setpath() / _getpath()
使用_setpath()可以指定一个包所在的路径, 每个包可以指定一个路径. 一个包所包含的下一级包可以指定不同的路径. 调用 _setpath() 时路径信息被存放在$esoe._lib对应的名称空间的$path属性下.

使用_getpath()可以提取出一个包或类所在的路径. 提取出的路径包括对本包所设置的路径, 附加上本包的名称. 对于类路径, 与包路径相同, 仅须加上文件的扩展名.

例子:
如果同时设置了
	_setpath("com","../lib/" );
	_setpath("com.mylib","../lib2/" );
那么
	"com.xtree.WebFXTree" 将从 ../lib/com/xtree/WebFXTree 加载
	"com.mylib.class1"将从../lib2/ mylib/class1加载
类库文件自动加载 (M3)
当ESOE系统发现一个类的构造器未加载时, 会将类的名称记录于$esoe._lib对应名称空间的$fail, 并将_import的全局参数记录在$map (非全局参数不记录). 然后会尝试自动加载类库.

系统根据$esoe._libmode确定是先加载类文件还是整个包的类库文件_all. 在确认未重复加载的情况下进行以下工作,

* 如果加载了任何文件, $esoe._lib.$count加1.
* 如果是加载_all文件, $esoe._lib.$ext会置1.
* 如果加载了文件, 将$esoe._lib对应类或包的名称空间的$inc加1.
* 如果$esoe._lib.$ext已置1, 不加载类文件, 只加载_all文件.
更新加载的类 / _update() (M3)
如上节, ESOE系统在自动加载类库时对失败的类作了记录. 使用_update() 对所有的记录进行重新检查. 在_update()中进行以下工作,

* 如果类已完备, 清除对应的$fail标志
* 将检查到有$fail标志的类重新导入
* 如果重复检查后失败记录未作更改, 更新操作失败.
* 如果ESOE的实现具有循环加载的机制, 当_lib.$count>0时, 清除_lib.$count和$ext标志, 并将_update()加到循环加载的最后一条.
类定义
在ESOE中, 类特指构造器的原型 (constructor's prototype). 但构造器也可用于指示类, 构造器和原型在对类的描述上处于同一级别.

每一个类的构造器都应该具有一个声明函数 (_declare), 这个函数是一个不带参数的函数 (Function) 对象. 
	[constructor]._declare= function()
	{
		...
	}

在声明函数中, 构造器的原型可以被创建, 并且进行初始化. 如果类声明过程成功完成, _declare应返回true, 如果类声明过程出现错误, _declare应返回false. 声明函数是一个被ESOE系统所使用的回调函数.

在声明函数中, 必须进行类规范化操作.

如果要在声明函数中定义原型的方法, 应注意这些方法是使用闭包函数的方式定义的, 应减少在声明函数内和闭包函数外的位置定义新的变量. 声明函数是一个不带参数的函数, 也是为了避免这个问题.
this
ESOE建议在对类的方法进行调用时, 要确保提供正确的this对象, 而不应将this对象设为另一个对象, 如GLOBAL对象等.

在this对象容易发生混淆的情况下, 建议在直接在参数中指明this对象.
类导入 / _import()
类导入与类的规范化相似, 但是用户可指定名称空间的映射对象.

当用户导入一个类时, ESOE系统自动调用构造器的声明函数. 这时, 构造器的原型尚未被任何实例所引用, 因为在此之前, 还未有任何语包执行 new [构造器] 来创建构造器的第一个实例.

在M3中, 一个类如果还未正常载入, 导入过程会记录下这个类, 以供后续的自动加载工作使用.
类继承 / _derive()
在ESOE中, 如果一个类继承自一个基类, 将继承类的原型设置为基类的一个新实例.
	[class].prototype= new [baseclass];
这一语句隐含在ESOE系统的 _derive() 过程中. 在_derive() 过程中还包括对基类和继承类的规范化操作.

如果类继承成功, 系统会添加以下属性到继承类的原型中,
	_esoe._base : 基类所对应的构造器的prototype.
如果_esoe._conflict不为1, 为方便用户使用, 继承操作会做以下工作,
	func.prototype._base= func.prototype._esoe._base;

在继承类声明函数中, 应该使用 _derive([thisclass],[baseclass]) 设置类继承关系, 而不应该直接设置prototype的值.

如果未加载M3, 所有的基类应被预先加载, 否则_dervice返回false, 继承类声明失败.

如果已加载M3, 如果基类未加载, _dervice返回false, 这时继承类的声明函数也应返回false, 等待下一次重新声明.
多继承和属性拷贝 / _derivex()
ESOE利用属性拷贝来实现多继承. _derivex()将指定的基类的所有可见属性拷贝到继承类, 拷贝过程如有属性的名称发生冲突, 则忽略这个属性.

属性拷贝仅拷贝那些简单型变量, 如String, Number, Boolean, null等, 对于对象变量, 仍然只拷贝其引用, 如Object, Array, Function等.
类属性的修饰
在ESOE中, 建议用户在构造器或声明函数中使用以下方式实现对类属性的修饰.
内在修饰类型属性声明位置访问位置
1private任意构造函数, var声明构造函数
2static, private任意独立的声明函数, var声明声明函数
3public变量使用prototype.[propety]  声明简单变量, 并直接赋值任意
4static, public对象使用prototype.[propety]  声明对象变量, 并直接赋值任意
5public对象使用prototype.[propety]  声明对象变量, 并在_set()中赋值任意
其中, 变量指简单变量, 如String, Number, Boolean, null等; 对象指对象变量, 如Object, Array, Function等.

ESOE建议只使用表中的3,4,5方式. 方式1和2虽然可以实现属性隐藏等功能, 但同时带来代码格式不统一, 闭包函数等问题. 如果确实有必要使用, 应尽可能减少不必要的变量引用, 并使用清理函数机制.
类实例初始化 / _set()
ESOE系统不支持在声明时附加参数, 也就是不支持类初始化参数, 但支持类实例初始化参数.

每一个ESOE类的原型都应带有一个_set()方法, 以对类实例进行初始化. 这个方法建议使用与构造器相同的参数. _set()方法在以下情况使用,

1. 在类实例化时调用_set()方法. 
2. 在有类继承的情况下, 继承类在声明时, 会调用无参数的基类构造器过程, 这时由基类自行处理_set()的无参数调用方式.
3. 在有类继承的情况下, 继承类在其自己的_set 方法中, 以call方式调用基类的_set 方法,
	this._base._set.call( this, ... );
使用其它类
如果在类中要使用其它类, 在声明函数必须先导入这些类, 以备以后使用.
类布局例子1
这里是一个从ESOE类向导生成的一个例子 (经过简单改动) .
1. 构造器除了作为创建对象的构造器外, 当作为函数直接调用时, 还作为对类的声明函数的调用, 这样可以减少对关键字_declare的依赖性.
2. 在声明函数中, 是用闭包函数的方法对原型方法进行定义的, 但由于没有参数和变量, 避免了部分闭包函数带来的引用问题.
类布局例子2
这里是一个从ESOE类向导生成的另一个例子 (经过简单改动) . 这个例子所生成的类与例子1完全相同.
1. 直接将声明函数的内容写在构造器内, 构造器的原型预定义为一个对象.
2. 这种方式完全消除了闭包函数.
3. 缺点之1: 在_derive()中, 既要生成新的基类原型, 也要保持已存在的原型, 内部工作量增加.
4. 缺点之2: 构造器的原型即使不使用, 预定义也一定会进行.
资源加载方案 / _loadres()
ESOE的资源加载方案, 主要目标是使用_getpath() 获取类文件对应的物理路径, 并半自动化地加载类文件所使用的其它类型的文件, 如样式文件, 图片文件等.

例如在HTML中, 如果要加载一个类的样式文件, 可以预先定义将样式文件布置为在类所在的文件夹的 _res/[类名]/ [类名].css文件. 这样就可通过简单的方式半自动地加载.
ESOE共享 (M5)
ESOE的共享机制实现以下目标,
	1. 共享 $esoe 对象.
	2. 共享加载类库.

第一个被加载的$esoe对象被称为主ESOE, 在新环境构建的$esoe对象被称为从属ESOE. 类库即可在主$esoe对象中加载, 也可在从属$esoe对象中加载. 如果类库在主$esoe对象加载, 它们可以被所有的从属$esoe共享. 如果类库只在某一个从属$esoe对象中加载, 那么这些类库只被这个从属$esoe对象所使用.
共享 $esoe 对象
ESOE通过以下方法实现$esoe对象共享

1. 在新环境构建一个空对象$esoe(从属ESOE), 此对象的原型是另一个已存在的$esoe.
2. 设置新$esoe的_global属性为新的全局对象.
3. 构建新的$esoe.ns和$esoe._lib变量.
4. 设置相关的关键字函数
共享初始化 / prototype._share
对于一些与运行环境交互的类, 在声明类时要求建立一个prototype._share()方法, 用于初始化类在运行时的全局环境. 这个方法在以下情况被用到,

1. 类内部与全局环境交互时, 使用由prototype._share()建立的指示全局环境的变量, 而不要直接使用全局环境.
2. 类继承时, 如果基类已有_share()方法, 继承类不必建立_share()方法.
3. 在使用_import()关键字时, ESOE系统将创建一个空的继承类, 并以当前全局环境为参数调用新类的_share方法. 在实现时应注意新类参数的传递问题.

提示: ESOE的类共享策略会使运行效率稍有降低, 因此用户可以主动使用其它方式获取类在运行时的全局环境. 例如, 对于HTML, 对界面类传递HTML元素而不仅仅是HTML元素的id值, 这样可以通过HTML元素自身获取全局环境. 这种方法应注意不同平台的兼容性问题. 代码例子如下,
代码例子
清理函数
在当前(2006/7), 一些主流的ECMAScript实现系统 (如IE6及以下版本) 内部存在Bug. 主要表现为, 当多个对象间发生循环引用时, ECMAScript对象会发生无法释放的问题. ESOE引入清理函数/析构函数机制方案, 使用户可清除有可能发生的循环引用问题, 提高应用系统的实用性. 这个机制可通过引擎参数 _nodestroy关闭.

ESOE的清理函数机制并不在变量的作用域失效后对变量进行清除, 而是在GLOBAL对象即将被卸载前由用户手工激活ESOE的清理机制, 例如对HTML/javascript, 在window.unload事件中调用$esoe.Destroy()即可激活ESOE的清理机制.

ESOE要求清除的循环引用包括:
	1. 与全局环境间的相互引用.
	2. 与类库文件间的相互引用.
	3. 共享ESOE引擎所引起的相互引用.
	4. ESOE引擎内部的相互引用
清理ESOE引擎
ESOE引擎本身是一个ECMAScript对象, 在清除时应进行以下工作,

1. 清除全局环境变量 _global, _main等
2. 清除全局环境关键字
3. 如果是主ESOE引擎, 清除所有共享引擎
4. 清除ns下所有类, 如有必要, 清理这些类所构建的所有对象.
清理类 / prototype._destroy()
须要进行清理工作的类, 可建立一个prototype._destroy()方法, 供EOSE在应用系统结束时自动调用.

在prototype._destroy()方法, 应进行以下工作,

1. 清理所有由prototype._share构建的, 与全局环境相关的变量.
2. 清理所有参数传入并保存下来的与全局环境相关的变量
3. 如有继承关系, 清除类的prototype对象.
4. 清理本类所用的对其它类的引用.
清理共享引擎和共享类
当使用M5时, 由于共享引擎必然带来全局环境间的相互引用, 必须注意以下问题,

1. 对共享类的prototype的清理.
2. 对共享类所建立的对象的清理.
3. 对引用主全局环境对象的临时变量的清理.

* All Rights Reserved * 版权所有 * 2000-2006 * www.viviasoft.com * Powered by supertree & xforum *

粤ICP备06042644号