//------------------------------------------------------------------------
// QoBean - Qomo's beans
//
// documents group(chs) - Aimingoo, Zhe
//------------------------------------------------------------------------
一、QoBean的发起
---------------------
我对Qomo的不满由来以久,最根深蒂固的便是它的命名空间的实现方式:隐式地维护路径与
命名空间系统。所以有一段时间,我几乎不敢看Qomo的Framework\Names\下的代码。
我对Qomo不满之处很多,但归结起来只有一条:太大太复杂。但它比那些“看起来不怎么复
杂”的项目有太多特性要实现,因此复杂是必然的。我只是一直以来无法跳开一个圈子:为
什么复杂的,一定不能简洁?
QoBean的触动来自于一篇文档(忘掉了出处),说在JavaScript中实现类继承只需要几行代
码而已。我当时想:是啊,只需要几行代码就行了,为什么Qomo的Object.js写了20k代码,
以及包括8个子文件呢?
我决定扔掉所有在Qomo Object Framework中的所有其它的(并不见得是多余的)特性,我想
知道,在Qomo的设计思想中,一个最小化的“类继承”到底需要多少代码?
于是我建立了一个目录QomoMini,现在它被签入到了Qomo的项目中,改名作QoBean。QoBean
是这个子项目的代码名。
二、最初的QoBean
---------------------
当然,首先是从Qomo中的Object.js下手,最初的代码被精减成这样:
=======
function Class(Parent, Name) {
function _Create() {
if (this.Create) this.Create.apply(this, arguments);
}
var Constructor = (Name instanceof Function) ? Name : eval(Name);
var cls = new Function();
if (Parent) Constructor.prototype = Parent.Create.prototype;
_Create.prototype = new Constructor();
_Create.prototype.constructor = _Create;
(Name instanceof Function) || eval(Name + '= _Create');
return cls;
}
TObject = Class(null, Object);
=======
这个代码实现了几项关键功能,包括:
- 支持类声明与类注册
- 支持匿名类
使用示例1, 例如:
=======
// 1. 类声明
function MyObject() {
// 类构造周期
// ...
this.Create = function() {
// 实例构造周期
}
}
// 2. 类注册
TMyObject = Class(TObject, 'MyObject');
// 3. 创建对象
obj = new MyObject();
=======
可见,该例仍然保持了Qomo的一般性语法。
使用示例2, 例如:
=======
arr = [];
arr.push(Class(TObject, function() { //<--注册一个匿名函数为匿名类
// 类声明...
}));
// 创建对象
obj = new arr[0];
=======
该例简单的注册了一个匿名类。匿名类是类厂等设计模式中的基础技术。
三、QoBean alpha 1
---------------------
上述的Class()丢掉了几项Qomo的特性,例如“obj = aClass.Create()”语法,以及没有显
式维护的类继承关系等等。但由于代码基本都是从Qomo的Object.js中截取出来的,因此保留
了Qomo的原始状态。
接下来我们讨论如何在上述基础上实现更多的QoBean特性。
1. _Create()不需要实现为嵌套函数
---------
上面代码中的_Create()被实现为Class()的内嵌函数,因此在执行中它处于一个闭包链的末
端,这会使它的效率稍为低一点。但显然,由于_Create()没有什么地方要引用Class()内的变
量,所以它可以实现在全局——但是如果直接实现在全局又会占用一个标识符。
处理的办法是使用new Function()。
2. eval(Name)的特性
---------
上面代码中试图识别参数Name是否是一个函数,如果是函数则认为是注册匿名类——不需要
重写原标识符,也不需要类名;而eval(Name)用于得到Name所指定的构造器。这一行代码写作:
=======
var Constructor = (Name instanceof Function) ? Name : eval(Name);
=======
然而事实上不需要这么麻烦,eval()函数执行时如果参数不是字符串就会返回该参数本身,
所以更加简洁的代码是:
=======
var Constructor = eval(Name);
=======
3. constructor赋值操作过于啰嗦
---------
无论如何,用两行代码来完成原型重写和constructor赋值是过于啰嗦的,我们有更好的方法。
4. 包括上述特性与修改的新版本
---------
通过下面的修改,可以有更为精简的代码、更高的效率,以及一个外部维护的类名。
=======
// class register util
function Class(Parent, Name) {
var Constructor = eval(Name);
var cls = new Function('Base', 'return new Base');
var _Create = new Funcction('if (this.Create) this.Create.apply(this, arguments)');
Parent && (Constructor.prototype = Parent.Create.prototype);
cls.Create = (_Create.prototype = cls(Constructor)).constructor = _Create;
(Name instanceof Function ? Name = 'Anonymous' : eval(Name + '= cls.Create'),
cls.ClassName = 'T' + Name);
return cls;
}
};
TObject = Class(null, Object);
=======
四、发布QoBean alpha 1的最后修改
---------------------
正式发布的QoBean alpha 1比上面的代码要复杂一些。但复杂的这一部分,就是“框架”与一
个普通的工具函数之间的不同。
我们既然希望QoBean是将来的Qomo V3的基础,那么必然的,我们需要解释将来的Qomo V3是怎
样的一种结构——我们需得先画好蓝图,然后再行建设。
QoBean试图在Qomo V3中添加“元系统”,用于添加新的语言特性/特性集,或者构建新的语言。
通过元系统在QoBean中创建Qomo对象模型的基本框架为:
=======
aClass = new MetaClass();
aClass.Create = new MetaObject();
aObject = new aConstructor_RegedByClass; // or
aObject = aClass.Create();
=======
而在Object.js中,MetaClass与MetaObject的实现非常简单:
=======
MetaClass = Function;
MetaObject = Function;
=======
到了更将来的版本(事实上这个版本已经在开发中),我们会重写这两个“元(数据类型)”,
并由此构建更为复杂的语言逻辑。
此外,为了实现Qomo中的“aClass.Create()”语法,QoBean添加了一些代码,并加入了一个
可选开关,大概的框架代码如下:
=======
Class = function(ext) {
var idx = 0;
var code = ext ? '\
if (this instanceof Function) {\
var i, v=arguments, n=v.length, s="new this.Create(";\
if (n>0) for (i=1,s+="v[0]"; i<n; i++) s += ", v[" + i +"]";\
return eval(s+");");\
}' : '';
code += 'if (this.Create) this.Create.apply(this, arguments)';
return function(Parent, Name) {
var Constructor = eval(Name);
var cls = new MetaClass('Base', 'return new Base');
var _Create = new MetaObject(code);
...
}
}(true); // is delphi extand syntax.
=======
注意上述代码中,变量code的字符串使用了特殊的语法来声明直接量:行末使用“\”,表
明字符串是连续的。
其它代码请参见QoBean的下载包或SVN:
http://blog.csdn.net/aimingoo/archive/2007/12/31/2006369.aspx
五、其它
---------------------
1. QoBean的Namespace.js中添加了命名空间的支持并重写了Class()以支持它;
2. QoBean的代码包包含更多的示例。
3. 所谓“类继承系统”是指继承关系的维护,不包括Qomo中的get/set,以及inherited等特性。
分享到:
相关推荐
标题“QoBean.2008.10.14”指的是一个关于QoBean技术的特定版本或更新,发布于2008年10月14日。QoBean是一个JavaScript库,旨在提高JavaScript开发中的面向对象编程能力。这个库可能是由“aimingoo”创建或维护的,...
单项海洋环境影响评价等级表.docx
【作品名称】:基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:本设计中的波形发生器系统要求基于51单片机,因此选用以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器的硬件系统。使用C 语言对单片机编程可产生相应的正弦波,方波,三角波,锯齿波梯形波波形信号。在程序运行时,当接收到按键信息后,需要输出某种波形时,调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出即可得到要求的波形。 当需要改变频率时只需要改变单片机的波形发生程序中的递增或者递减变量即可。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 完全多元图的最大匹配问题研究 共9页.pdf
本项目是基于Python Web的社区爱心养老管理系统,旨在为社区养老提供一个全面、高效的管理平台。系统集成了用户管理、老人信息管理、健康管理、活动管理、服务管理等多项功能,通过简洁明了的界面,让管理人员能够轻松地进行各项操作,从而更好地服务于社区老人。 在架构上,系统采用B/S模式,前端使用HTML、CSS、JavaScript等技术,搭配Vue.js框架,实现了用户友好的交互界面;后端则基于Python的Django框架,提供了稳定且高效的服务端逻辑处理能力。数据库选用MySQL,确保了数据的存储安全和高效访问。 开发此项目的目的,不仅是为了满足计算机相关专业学生的毕设需求,提供一个实战练习的平台,更是希望通过实际项目的开发,培养学生的专业技能和实践能力,同时,也希望能为社区养老服务贡献一份力量,通过科技手段,让老年人的生活更加美好、便捷。
教学版单体spring-petlinic,课程《Kubernetes微服务实践》
内容概要:本文介绍了16世纪法国外交家Blaise de Vigenère提出的一种多表密码算法,详细解释了Vigenère密码的加密解密机制及其历史应用背景。特别提到了当明文M的长度超过密钥K的情况下,密钥会被重复使用的技巧。 适合人群:对古典密码学感兴趣的初学者,以及希望深入理解密码编码基本原理的学习者。 使用场景及目标:了解Vigenère密码的工作原理,掌握简单的加解密技术,增强信息安全意识。能够自行实施加解密操作,理解经典密码学的基本概念和技术。 其他说明:本文不仅提供了理论讲解,还给出了具体的例子帮助理解和实操练习。
STM32-EMBPI : Embedded Pi, triple-play platform for STM32, Raspberry Pi and Arduino
内容概要:本文主要探讨了电子电气架构中的网络管理策略,尤其是针对汽车中多个ECU(Electronic Control Unit)的协同管理和低功耗设计。通过引入网络管理状态机的概念,详细介绍了各状态(如常规运行状态、重复报文状态、准备睡眠模式、预睡眠模式、深度睡眠模式等)的具体运作机制及其在汽车电子系统中的重要性。文中还讨论了网络管理报文的设计与传输规则,特别是控制位向量CBV的定义,强调了网络管理在节能降耗方面的关键作用。 适用人群:具备一定汽车电子工程背景的专业人士或研究者,尤其对网络管理及低功耗设计感兴趣的工程师。 使用场景及目标:适用于汽车设计与制造企业的研发部门,帮助其优化电子控制系统,提升产品能效比,降低维护成本,提高用户体验。通过对网络管理策略的理解与应用,达到降低车载电子系统功耗的目的,进而延长电动车的续航能力和降低传统燃油车的油耗。 其他说明:文章不仅提供了理论上的阐述,还包括了具体的操作指南和技术细节,有助于从业者深入理解和实施网络管理方案。同时提醒在现代信息化社会中保持屏蔽力的重要性,鼓励读者专注于自己的发展目标,避免无效的精力分散。
英飞凌TC3XX_MCAL培训PPT
缴费综合服务系-JAVA-基于springBoot高校网上缴费综合服务系统设计与实现
Python与机器学习方向,《TensorFlow基础教程》课程仓库
【资源说明】 本科毕业设计 基于Python+Django教学资源管理系统网站详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
内容概要:文章详细讨论了汽车行业正经历的重大变革,尤其是电动汽车(EV)和软件定义汽车(SDV)对行业的深远影响。随着技术的进步,汽车的差异化优势不再仅限于机械硬件,而是越来越多地取决于软件和服务。这一转型要求汽车制造商重新评估现有的解决方案堆栈,加大在电气化和连接性等领域的投资,以实现车型的电气化并支持可扩展性和全生命周期更新。同时,汽车的开发重点已经从机电领域转向了芯片和软件领域,强调基于云计算的协作开发方法。 适合人群:汽车行业专业人士、汽车电子工程师、技术研发人员及政策制定者。 使用场景及目标:帮助读者理解和把握汽车行业数字化转型的趋势,指导他们在电动汽车和软件定义汽车领域做出正确的技术投资和战略调整。 其他说明:本文不仅讨论了技术变革,还深入剖析了由此带来的商业和运营模式的变化,为汽车行业的未来发展方向提供了洞见。
微信课堂助手 微信小程序+PHP毕业设计 源码+数据库+论文+启动教程
新设博士后科研工作站备案申请表.xlsx
的玩具 Python 实现手套蟒蛇GloVe的玩具 Python 实现。Glove 产生单词的密集向量嵌入,其中一起出现的单词在生成的向量空间中靠得很近。虽然这会产生与word2vec (在gensim中有一个很棒的 python 实现)类似的嵌入,但方法不同GloVe 通过对语料库词共现矩阵的对数进行分解来产生嵌入。代码采用异步随机梯度下降,用Cython实现,很可能存在大量bug。安装使用 pip 从 pypi 安装pip install glove_python。OSX 用户请注意由于使用 OpenMP,glove-python 无法在 Clang 下编译。要安装它,您需要一个较新的版本gcc(例如来自 Homebrew)。应该由 接收setup.py如果没有,请打开一个问题。使用 OSX 中包含的默认 Python 发行版进行构建也不受支持请尝试 Homebrew 或 Anaconda 中的版本。用法生成嵌入分为两个步骤从语料库中创建共现矩阵,然后使用它生成嵌入。该类Corpus有助于从可交互的标记构建语料库该类Glove训练嵌入(使
消息中间件rabbitmq学习的一些代码、笔记
环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目均可完美运行
空气质量现状评价表.docx