摘要:
现在的语言,如果不有那么一点OO的影子,都不好意思称之为语言了。在XML的语义约束方面,DTD虽然简单,但是功能不够强大,完全是直白的描述,于是又有了替代DTD的XSD(XML Schema Definition),XSD引入了数据类型,提供了自定义数据类型的各种机制,甚至还能找到继承、多态等各种OO特征,然而学习起来也就相对复杂了,从这篇笔记开始学习一下XSD。1、XSD文件是一种XML文件 XSD文件是一种XML文件,满足所有XML文件格式的一切要求,比如有且仅有一个根元素(这个根元素就是),所有对XML文件有效的技术对XSD文件也同样有效,包括使用XSD文件作为语义约束。2、XSD... 阅读全文
摘要:
在上一篇笔记中,将文档类型分类时,曾经根据文档是否使用并遵守了DTD或Schema来区分为格式良好的XML和有效的XML,那么什么是DTD和Schema呢?DTD和Schema都是用来规范XML文档的,对XML文档进行语义约束的,DTD简单易用,Schema则功能强大。在这篇笔记中,首先学习一下DTD(Document Type Definition,文档类型定义)。1、在XML文档中怎么使用DTD导入方式语法格式说明内部DTD将DTD定义放在XML文档内部,紧跟在XML声明和处理指令后面如: ]>外部DTD将DTD单独定义在一个文件内,然后通过关键字SYSTEM导入DTD如:公用DTD 阅读全文
摘要:
我对于XML是很不够重视的,认识也是非常肤浅的,因为在之前的Web经验中,基本上都可以使用JSON来代替XML,JSON网络流量少,解析快,JS支持好等这些特点让我对自己的观点坚信不疑。然而我渐渐地改变了这些观点,最近写了一个基于Spring的服务配置体系,主要思想是将一些常用的服务封装成服务类,预留一些参数接口,然后通过Spring注入这些参数以及服务类之间的各种关系,实现业务逻辑配置化,尽最大可能地实现代码复用、易于维护等,在实际开发以及运用时,Spring配置文件变得越来越大,于是产生了能否将服务配置剥离出来单独管理的想法,但是这个想法一开始就遭遇了非常大的挫折——这源于我在XML领.. 阅读全文
摘要:
从这篇笔记开始整理JavaScript的第三部分:文档对象模型DOM(Document Object Model)。DOM是针对HTML和XML文档的一个API,脱胎于DHTML,由W3C负责制定相关标准,现在已经成为表现和操作页面标记的真正的跨平台、语言中立的一种标准,除了JavaScript外,其它一些语言比如SVG、MathML等也不同程度的实现了各自的DOM。1、DOM组成和级别 DOM分为三个组成部分和三个级别:组成部分说明核心DOM用于任何结构化文档的标准模型XML DOM用于XML文档的标准模型,定义了所有XML元素的对象和属性,以及访问它们的方法(接口),换句话说,XML... 阅读全文
摘要:
访问和操作浏览器窗口的模型称为浏览器对象模型BOM(Browser Object Model),但习惯上是把所有针对浏览器的JavaScript扩展都纳入BOM的范畴。BOM提供了一组独立于网页内容而与浏览器交互的对象,但由于缺乏相关的行业规范,各浏览器提供商在很长一段时间内都是按照各自的想法去实现这些对象的,因而浏览器之间共有的对象也就成为了事实上的标准,这种局面在HTML5出现后有望得到改观——HTML5致力于把很多BOM功能写入正式规范。由于不同浏览器之间的差异性,这里总结的主要是一些我认为比较常用的共有的特性,至于开发过程中的兼容性考虑,就交给流行的JS库吧(比如jQuery、Ex.. 阅读全文
摘要:
通常而言,JavaScript由ECMAScript核心、BOM和DOM三部分构成,前面的文章将ECMAScript核心部分粗略的过了一篇,接下来应该是BOM和HTML5了,但是鉴于ECMAScript5相对于ECMAScript3的新变化比较多,而且这些变化也非常的有意思,因此在这篇文章中再将我认为的有意思的变化(并非全部变化)集中整理一下,但这里只是列举,不具体展开。一、语法变化1、关键字和保留字 在ES3中,使用关键字做标识符会导致“Identifier Expected”错误,而使用保留字做标识符可能会也可能不会导致相同的错误,具体取决于特定的引擎。在ES5中,关键字和保留字虽然... 阅读全文
摘要:
前面在分析PhoneGap源码的时候,曾经总结过一次正则表达式的用法,为了不同系列文章的完整性,这里将那里的总结迁移过来。需要指出的是,这里只是总结了正则表达式的常用的且比较简单的语法,而不是全部语法,在我看来,掌握了这些常用语法,已经足够应对日常应用了。正则表达式不只是应用在ECMAScript中,在JAVA、.Net、Unix等也有相应应用,这篇文章则是以ECMAScript中的正则表达式为基础总结的。一、正则表达式基础1、普通字符:字母、数字、下划线、汉字以及所有没有特殊意义的字符,如ABC123。在匹配时,匹配与之相同的字符。2、特殊字符:(需要时,使用反斜杠“\”进行转义)字符含.. 阅读全文
摘要:
内建对象是指由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在程序运行之前就已经存在了。内建对象就好比是JDK中的类库,开发者可以直接拿来使用,这极大的方便了常见的编程任务。这篇文章就来浏览一下主要的内建对象,当然,我们并不是第一次接触内建对象,前面已经接触到的就有Object、Function、Boolean、Number、String,对于已经介绍过的,这里再总结复习一下,没有介绍过的,根据相关性来对比的总结,RegExp对象及正则表达式在下一篇中再单独介绍。1、内建全局单例对象(1)内建全局单例对象:在整个执行环境中只有一个对象实例,这些对象没有内部属性[[Cons.. 阅读全文
摘要:
在ECMAScript中,两个核心主题就是对象与函数,而这两个主题也有些互相缠绕的,在前面几个博文中大略的过了一遍函数相关的基础知识,这篇文章再回到对象主题上来。1、对象再认识(1)对象属性和特性 什么是属性(Property),什么是特性(Attribute),这有什么区别?我不想也不会从语义学上去区分,对于这系列文章来说,属性就是组成对象的一个部分,广义上也包括对象的方法,而特性则是指被描述主体所具有的特征,换句话说,属性是我们可以通过编码来访问的具体存在,而特性则主要是为了便于理解概念的抽象存在,当然,特性也可以通过相应的属性来具体外化。这一小节所讲的对象属性的特性就是对对象属性特... 阅读全文
摘要:
再接着看函数——具有魔幻色彩的对象。9、作为值的函数 在一般的编程语言中,如果要将函数作为值来使用,需要使用类似函数指针或者代理的方式来实现,但是在ECMAScript中,函数是一种对象,拥有一般对象具有的所有特征,除了函数可以有自己的属性和方法外,还可以做为一个引用类型的值去使用,实际上我们前面的例子中已经有过将函数作为一个对象属性的值,又比如函数也可以作为另一个函数的参数或者返回值,异步处理中的回调函数就是一个典型的用法。var name = 'linjisong';var person = {name:'oulinhai'};function getNam 阅读全文
摘要:
接着看函数——这个具有魔幻色彩的对象。在上篇文章中说函数内部属性时,还遗留了一个this内部属性没有解释,不过在说this之前,我想先说一说执行环境和作用域的概念。6、执行环境和作用域(1)执行环境(execution context):所有的JavaScript代码都运行在一个执行环境中,当控制权转移至JavaScript的可执行代码时,就进入了一个执行环境。活动的执行环境从逻辑上形成了一个栈,全局执行环境永远是这个栈的栈底元素,栈顶元素就是当前正在运行的执行环境。每一个函数都有自己的执行环境,当执行流进入一个函数时,会将这个函数的执行环境压入栈顶,函数执行完之后再将这个执行环境弹出,控.. 阅读全文
摘要:
变量类型 在说函数之前,先来说说变量类型。1、变量:变量在本质上就是命名的内存空间。2、变量的数据类型:就是指变量可以存储的值的数据类型,比如Number类型、Boolean类型、Object类型等,在ECMAScript中,变量的数据类型是动态的,可以在运行时改变变量的数据类型。3、变量类型:是指变量本身的类型,在ECMAScript中,变量类型就只有两种:值类型和引用类型。当变量的数据类型是简单数据类型时,变量类型就是值类型,当变量的数据类型是对象类型时,变量类型就是引用类型。在不引起歧义的情况下,也可以称变量的数据类型为变量类型。 那么,值类型和引用类型有什么区别呢?最主要的一个,就.. 阅读全文
摘要:
砌好墙,下面出场的就是房子了,在ECMAScript中,对象就是我们所说的房子,至于你所写的整个应用程序,那就是一整套建筑群了。在房子里面可以放你想放的任意事物——如果你有足够的美学造诣,你甚至可以弄一个房中房试试——当然,为了方便管理,我们会给房子里存放的所有事物都会取上一个不重复的名字,比如医药房间里的各种药品名称。在ECMAScript中,你可以在对象中存放任意你想放的数据,同样,我们需要给存放的数据取一个名字——也就是对象的属性名,再存放各种数据。再看看ECMA-262中对象的定义:无序属性的集合,其属性可以包含简单数据类型值、对象或者函数。 进入对象,我开始有些激动了,说实话,... 阅读全文
摘要:
砖瓦和水泥都有了,接下来该是砌墙了,在ECMAScript中,语句就是我们需要砌的墙了。语句也和操作符一样,对于有C背景的人来说再自然不过了,下面采用类似的形式整理一下语句的相关知识,重点突出一些ECMAScript中比较特别和个人认为比较有意思的地方,同样,没有强调的但比较基础的语句并非不重要,而是我认为你已经熟悉。语句一览语句语法简要描述简单语句;语句以分号(;)结束,在不引起歧义的情况下也可以省略分号。语句块{}使用大括号({})将一组语句放一起组成一个语句块,在ECMAScript中,有语句块,但没有语句块作用域。if语句if(condition){}if(ocndition){}.. 阅读全文
摘要:
如果说数据类型是编程语言的砖瓦,那么运算符和操作符则是编程语言的石灰和水泥了,它是将各种数据类型的值有机组合的糅合剂,使得数据值不再只是一个孤立的值,而有了一种动态的灵性。在ECMAScript中,有非常丰富的运算符和操作符,在这篇文章中将按通常的分类来稍微整理一下,不过在整理之前,先说明一下:1、虽然标题是运算符和操作符,然而在我看来并没有多少严格区分的必要,在英文中,貌似也是用一个Operator来表示,所以在下文中我可能会混用。甚至,一些不属于运算符和操作符范畴的,我也整理在这里,只要我觉得必要。2、对于运算符的优先级,你无需一一牢记——我相信你知道最简单的”先乘除,后加减”,至于其.. 阅读全文
摘要:
数据类型是编程语言的砖瓦,是所有你能想象到的复杂抽象的基础,在现代编程语言中,除了语言本身内置的一些简单数据类型外,基本上都提供了用于自定义数据类型的语言机制(在C中也可以利用结构体来实现),这些机制在一定程度上也决定了该语言的流行度和生命力。ECMAScript是一种动态类型的语言,构建于5种简单数据类型(Undefined、Null、Boolean、Number、String)和一种复杂数据类型(Object)的基础之上。这篇文章就来复习一下简单数据类型,我会尽量从编程实践的角度来描述,下面代码运行环境为FireFox 14.0.1。简单数据类型简单数据类型取值Undefinedund.. 阅读全文
摘要:
这一篇复习一下ECMAScript规范中的基础语法,英文好的朋友可以直接阅读官方文档。JavaScript本质上也是一种类C语言,熟悉C语言的朋友,可以非常轻松的阅读这篇文章,甚至都可以跳过,不过建议你最好还是看一看,在介绍的同时,我可能会引用一些自认为不易理解且比较流行的用法。基础语法1、标识符:所谓标识符,实际上就是指一个满足一定规范,能够被引擎识别的名字,可以用来表示常量、变量、函数名、函数参数、对象、对象属性等所有可命名对象的名称。(1)区分大小写。(2)以字母、下划线(_)或美元符号($)开头,其它字符可以为字母、下划线、美元符号或数字。这里的字母包含扩展的ASCII或Unico.. 阅读全文
摘要:
在JavaScript面世之初,没有人会想到它会被应用的如此广泛,也远比一般人想象中的要复杂强大的多,在我自己学习的过程中,曾经有过多次震撼,只是常常没有过多久,很多美轮美奂的用法就又模糊起来,希望通过对JavaScript高级程序设计(第3版)的专题学习笔记,能够较为系统的将基础知识梳理一次,也能够将自己平常学习与工作过程中遇到的一些美妙用法记录下来,便于自己再次学习,当然,也希望可以给有需要的朋友们一些力所能及的帮助。相关术语 先简要说一下和JavaScript相关的一些背景术语,就不详细讨论JavaScript的历史了,想了解的朋友可以参考原书。ECMA:欧洲计算机制造商协会(St... 阅读全文
摘要:
Java EE 开发平台随手记 Java EE开发平台随手记1 Java EE开发平台随手记2——Mybatis扩展1 Java EE开发平台随手记3——Mybatis扩展2 Java EE开发平台随手记4——Mybatis扩展3 Java EE开发平台随手记5——Mybatis动态代理接口方式的原 阅读全文
摘要:
在引导程序中,还导入了一个模块cordova/platform,看看源码:define("cordova/platform", function(require, exports, module) { module.exports = { id: "android", initialize:function() { }, objects: { }, merges: { } };});我们看到,在platform中,有四个属性:、1、id:我们这里的源码是取自android子目录下,这里平台id相应的为android,其... 阅读全文
摘要:
在引导程序中,导入cordova/builder之后,便是导入cordova/common,这是所有平台公共的模块部分,在cordova/common构造函数中,通过返回一个配置对象,非常精巧的将公共模块组织起来,并通过引导程序中的builder.build(base.objects).intoButDontClobber(window)将这些模块在window全局中构建。 我们看看这个配置对象:define("cordova/common", function(require, exports, module) {module.exports = { objects: { 阅读全文
摘要:
这一篇我们分析cordova/builder这个模块。 在具体看这个模块之前,先复习一下Object类型。(1)Object类型是所有它的实例的基础,所有的内置类型都是通过原型继承的方式继承了Object类。(2)Object的每个实例都有一个Constructor属性,指向创建这个实例的函数。(3)Object的每个实例都有下面的方法:A、hasOwnProperty(propertyName):检查propertyName是否在当前实例中(在实例原型中同样返回false)。B、propertyIsEnumerable(propertyName):检查propertyName是否可以使... 阅读全文
摘要:
在源码中,将cordova作为全局对象构建(window.cordova = require('cordova'))之后,又是一个立即调用的匿名函数,这是PhoneGap库的引导程序: 1 (function (context) { 2 var channel = require("cordova/channel"),//事件通道 3 _self = { 4 boot: function () {//定义引导函数 5 } 6 }; 7 8 channel.onNativeReady.subscri... 阅读全文
摘要:
转了一圈,再回到cordova这个模块。 在cordova中,首先是导入cordova/channel模块,这就是前一篇分析的,之后就触发在channel创建的onDOMContectLoaded事件,接着为了侦听deviceready、resume、pause等事件而重新定义了DOM规范中window和document的addEventListener和removeEventListener,然后再创建cordova这个对象,并作为结果“返回”。 1 function (require, exports, module) { 2 3 var channel = require... 阅读全文
摘要:
分析完了cordova/utils之后,回到cordova/channel这个模块来,这个模块是实现事件监听的基础,当然,我们的焦点是它的构造函数,源码中是匿名的,这里为了行文方便,姑且称之为factory。 要分析一个函数,从外部来说,知道怎么调用它就行了,这也就是通常所说的暴露在外的API,我们知道,factory是作为一个参数来传递给define函数的,并在第一次require中实际调用的,之后就清除了这个构造函数,回过头来看看这个调用的代码:1 function build(module) {2 var factory = module.factory;3 ... 阅读全文
摘要:
正则表达式的使用非常广泛,用法也比较灵活,不过平常遇到的都是正则表达式的简单用法,在这篇文章里,将尽量简单的梳理一下正则表达式,进而分析上一篇里面遗留的问题。一、正则表达式基础1、普通字符:字母、数字、下划线、汉字以及所有没有特殊意义的字符,如ABC123。在匹配时,匹配与之相同的字符。2、特殊字符:(需要时,使用反斜杠“\”进行转义)字符含义字符含义字符含义字符含义\a响铃符 = \x07^匹配字符串的开始位置\b匹配单词的开始或结束{n}匹配n次\f换页符 = \x0C$匹配字符串的结束位置\B匹配不是单词开始和结束的位置{n,}匹配至少n次\n换行符 = \x0A()标记一个子表达式.. 阅读全文
摘要:
在导入cordova的过程中,也即在调用cordova的工厂函数中,首先遇到的是导入另一个模块cordova/channel(注:这里由于函数声明提升,实际上是先执行工厂函数内部的其它函数声明,然后再执行下面的语句,但对这里的分析不受影响)define("cordova", function(require, exports, module) { var channel = require('cordova/channel'); //其它代码});然后,我们跟踪到cordova/channel的工厂函数,可以看到,仍然需要先导入cordova/utils这个 阅读全文
摘要:
跟随代码的执行,在定义了require和define并赋值后,是将cordova所有模块一一注册,例如:define("cordova",function(require,exports,module){//工厂函数内部实现代码});这里需要注意的是,工厂函数在这个时候并没有实际执行,而只是定义,并作为一个参数传递给define函数。所有模块注册完之后,通过window.cordova = require('cordova');导入至全局环境。因为是注册后第一次导入,所以在执行require('cordova')时,modules[' 阅读全文
摘要:
先看源码: 1 // file: lib/scripts/require.js 2 var require,//导入函数,导入cordova库的内部已经注册的模块,第一次导入时,先创建模块 3 define; //注册函数,注册cordova的内部模块 4 5 // 通过一个立即调用的匿名函数,给require和define赋值 6 (function () { 7 var modules = {}; // 缓存所有的模块,初始化为一个空对象 8 9 function build(module) {//内部私有函数10 var factory ... 阅读全文
摘要:
开始分析cordova-2.0.0.js的源码结构,使用UE打开这个文件,按Ctrl+Add键将代码全部折叠,可以看到结构如下:/** 版权申明及注释部分*/;(function(){// 这里是cordova的内部代码})();1、一开始就是一个分号";",我们知道,分号在javascript中主要作用就是结束一个语句以及构成for循环的语法结构,那么在这里是什么作用呢?个人理解,由于javascript中语句结束的分号并不是强制使用的,在这里主要是为了规范,以间隔于程序中编写或导入的其它js脚本,也就是给其它js脚本一个明确的语句结束符。这里强烈建议,每一个js语句,都 阅读全文