一、Qomolangma中完整的OOP支持:Object.js Qomo自Field Test4开始提供Object.js,这个单元用于在Qomo中支持完整的OOP特性。通过Object.js,Qomo中的JavaScript由原来的“原型继承”转变成了“类继承”。而且,这个转变对于开发人员来说,几乎是完全透明的。 通过Object.js,Qomo支持了如下的面向对象特性: 特性(Attribute)及读写器(getter/setter) 类注册与类继承( ...
一、Qomolangma对JS基本特性的增强 为了实现更为丰富的OOP特性,Qomo增强了JavaScript的一些基础特性。这主要表现在: 对JS基本类型系统(的方法)的增强 支持多投事件 这其中,对基本类型系统的增强,将严格恪守一条原则:不修改Object()对象原型。 除了array.indexOf()、array.remove()、string.trim() 等常见的增强之外,Qomo有几项特性是与其它可能(可能)不一致的。这几项内容随后列一专题来讲述: Array. ...
一、Qomolangma的兼容层设计 自Qomo Field Test3开始,系统从内核一层开始提供跨(浏览器)平台兼容的能力。Qomo试图在不同的浏览器上提供相同(或类同)的框架层特性。 Qomo 的兼容层设计跟常见的其它系统并不一致。基于“Qomo是可拆卸可组装的”这样一个基本思想,Qomo实现的兼容层完全可以“象插件一样增强,或者卸载”。 与一般的系统不同,Qomo基本上是基于IE 6的JScript语言特性来提供的兼容层支撑。也就是说,如果你向Qomo的兼容层添加一个插件,那么你应该致力于“使第三方浏览器表现得跟IE6一致” ...
Field Test 2发布中,包含一个命名空间和别名子系统的实现代码,以及一篇技术文档。 包括: /Framework/Names/* /Framework/DOCUMENTs/TestCase/T_Namespace.html /Framework/DOCUMENTs/命名空间的支持.txt 此外,Field Test 2修正了上一个版本的system.js中的两处bug: SafeArray2Str()转换中会因为body为奇数字节,导致最未一个字符丢失 ...
一、NamedSystem 模块概要 NamedSystem 是Qomo的可选载入模块。这个模块主要实现三个功能: 对$import()在路径识别上的增强 Namespace 子系统的装载 Alias 子系统的装载 // TODO: NamedSystem.js是firefox兼容的。 二、NamedSystem 模块的构成与载入 命名系统分成上述的三个部分,但它们的重要性并不相同。 $import()为了对路径识别进行增强,加入了一个标准的JavaScript对象:Url()。此后通过一个匿名函数的执行来实现对$ ...
一、system.js 模块概要 system.js是Qomo的第一个载入模块。这个模块主要实现三个功能: 基本的$debug()函数 基本的$import()函数 内核子系统的装载 system.js是firefox兼容的。 二、内核子系统的构成与载入 在Qomo中,所谓内核是指由直接在system.js中载入的模块构成的系统功能层。system.js实现了$import()函数,并通过它装载以下模块: ...
八、JavaScript面向对象的支持 6. JavaScript面向对象的支持的补充内容 1). 类型系统 我们前面已经完整地描述过JavaScript的两种类型系统。包括: 基础类型系统:由typeof()返回值的六种基础类型 对象类型系统:由new()返回值的、构造器和原型继承组织起来的类型系统 JavaScript是弱类型语言,因此类型自动转换是它语言特性的一个重要组成部分。但对于一个指定的变量而言,(在某一时刻,)它总是有确定的数据类型的。“运算”是导致类型转换的方法(但不是根源),因此“运算结果的类型”的确定就非常重要。 ...
八、JavaScript面向对象的支持 4. 实例和实例引用 在.NET Framework对CTS(Common Type System)约定“一切都是对象”,并分为“值类型”和“引用类型”两种。其中“值类型”的对象在转换成“引用类型”数据的过程中,需要进行一个“装箱”和“拆箱” ...
这些天在为Qomo项目写“JavaScript面向对象的支持”这组文章。也一直在期待网上购得的那本《JavaScript 权威指南》(第四版)快快到来。 在前公司,有这本书的第二或第三版,也一直将这本书视为经典。但那时并没有深入的去看它前几章的概念性叙述,而是把它当成一本手册来查。现在却刻意地关注了,因为Qomo的底层是以纯理论的OOP为基础的。 今天这本书终于寄到了,但是一读之下,大失所望。不知道作者对JavaScript语言的理解能力不够,还是他对OOP的理解不够。《JavaScript权威指南》这本书对面向对象的叙述不但不专业,而且还错误百出。实在不值一看。 试举几例: JavaScript没有正式的类的概念, ...
八、JavaScript面向对象的支持 3. 构造、析构与原型问题 4). 需要用户维护的另一个属性:constructor 回顾前面的内容,我们提到过: (如果正常地实现继承模型,)对象实例的constructor属性指向构造器 obj.constructor.prototype指向该对象的原型 通过Object.constructor属性,可以检测obj2与obj1是否是相同类型的实例 与原型链要通过用户代码来维护prototype属性一样,实例的构造器属性constructor也需要用户代码维护。 对于JavaScript的内置对象来说,constructor属性指向内置的构造器函数。如: // // 内置对象实例的constructor属性 // var _object_ ...
八、JavaScript面向对象的支持 3. 构造、析构与原型问题 我们已经知道一个对象是需要通过构造器函数来产生的。我们先记住几点: 构造器是一个普通的函数 原型是一个对象实例 构造器有原型属性,对象实例没有 (如果正常地实现继承模型,)对象实例的constructor属性指向构造器 从三、四条推出:obj.constructor.prototype指向该对象的原型 好,我们接下来分析一个例子,来说明JavaScript的“继承原型”声明,以及构造过程。 // // 理解原型、构造、 ...
八、JavaScript面向对象的支持 2. JavaScript面向对象的支持 5). 使用instanceof关键字的运算 在JavaScript中提供了instanceof关键字来检测实例的类型。这在前面讨论它的“五重身份”时已经讲过。但instanceof的问题是,它总是列举整个原型链以检测类型(关于原型继承的原理在“构造与析构”小节讲述),如: // // instanceof使用中的问题 // function MyObject() { // ... } function MyObject2() { // ... } MyObject2.prototype = new MyObject(); obj1 ...
八、JavaScript面向对象的支持 2. JavaScript面向对象的支持 2). 反射机制在JavaScript中的实现 JavaScript中通过for..in语法来实现了反射机制。但是JavaScript中并不明确区分“属性”与“方法”,以及“事件”。因此,对属性的类型考查在JS中是个问题。下面的代码简单示例for..in的使用与属性识别: // // JavaScript中for..in的使用和属性识别 // var _r_event = _r_event = /^[Oo] ...
现在ajax实现太过火了,什么都向上面靠。其实早在2000前以前,WEB开发人员就已经在用Frame/Frameset来实现远程数据的获取。后来IE成为事实上的B端标准之后,IFrame就成了做远程数据获取的“标准手段”了。——例如M$就用这种方法来做MSDN网站左侧的那个“巨大的树”。 在ajax出现之前,这一系列的技术被称为“RPC(Remote Procedure Call)”,象XMLRPC、HTTPRPC以及PHPRPC这些开源项目都是有的。PRC的一个问题,是必须实现一个S端,与WEB端的代码约定一个描述过程名(ProcedureName)和参数表的细节的接口。这其中, ...
书接上回: 《从基础开始:Qomo OpenProject中的一些关键词》(1)(2) 八、JavaScript面向对象的支持 很少有人对JavaScript的面向对象特性进行系统的分析。我希望接下来的文字让你了解到这个语言最少为人知的一面。 1. JavaScript中的类型 虽然JavaScript是一个基于对象的语言,但对象(Object)在JavaScript中不是第一型的。JS是以函数(Function)为第一型的语言。这样说,不但是因为JS中的函数具有高级语言中的函数的各种特性,而且也因为在JS中,Object也是由函数来实现的。——关于这一点,可以在后文中“构造与析构” ...