分享
 
 
 

&#106avascript面向对象的支持(1)

王朝html/css/js·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

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

Qomolangma OpenProject v0.9

类别 :Rich Web Client

关键词 :JS OOP,JS Framwork, Rich Web Client,RIA,Web Component,

DOM,DTHML,CSS,JavaScript,JScript

项目发起:aimingoo (aim@263.net)

项目团队:aimingoo, leon(pfzhou@gmail.com)

有贡献者:JingYu(zjy@cnpack.org)

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

八、JavaScript面向对象的支持

~~~~~~~~~~~~~~~~~~

很少有人对JavaScript的面向对象特性进行系统的分析。我希望接下来的文字让你了解到这

个语言最少为人知的一面。

1. JavaScript中的类型

--------

虽然JavaScript是一个基于对象的语言,但对象(Object)在JavaScript中不是第一型的。JS

是以函数(Function)为第一型的语言。这样说,不但是因为JS中的函数具有高级语言中的函

数的各种特性,而且也因为在JS中,Object也是由函数来实现的。——关于这一点,可以在

后文中“构造与析构”部分看到更进一步的说明。

JS中是弱类型的,他的内置类型简单而且清晰:

---------------------------------------------------------

undefined : 未定义

number : 数字

boolean : 布尔值

string : 字符串

function : 函数

object : 对象

1). undefined类型

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

在IE5及以下版本中,除了直接赋值和typeof()之外,其它任何对undefined的操作都将导致

异常。如果需要知道一个变量是否是undefined,只能采用typeof()的方法:

<script>

var v;

if (typeof(v) == 'undefined') {

// ...

}

</script>

但是在IE5.5及以上版本中,undefined是一个已实现的系统保留字。因此可以用undefined来

比较和运算。检测一个值是否是undefined的更简单方法可以是:

<script>

var v;

if (v === undefined) {

// ...

}

</script>

因此为了使得核心代码能(部分地)兼容IE5及早期版本,Romo核心单元中有一行代码用来

“声明”一个undefined值:

//---------------------------------------------------------

// code from Qomolangma, in JSEnhance.js

//---------------------------------------------------------

var undefined = void null;

这一行代码还有一点是需要说明的,就是void语句的应用。void表明“执行其后的语句,且

忽略返回值”。因此在void之后可以出现能被执行的任何“单个”语句。而执行的结果就是

undefined。当然,如果你愿意,你也可以用下面的代码之一“定义undefined”。

//---------------------------------------------------------

// 1. 较复杂的方法,利用一个匿名的空函数执行的返回

//---------------------------------------------------------

var undefined = function(){}();

//---------------------------------------------------------

// 2. 代码更简洁,但不易懂的方法

//---------------------------------------------------------

var undefined = void 0;

void也能像函数一样使用,因此void(0)也是合法的。有些时候,一些复杂的语句可能不能

使用void的关键字形式,而必须要使用void的函数形式。例如:

//---------------------------------------------------------

// 必须使用void()形式的复杂表达式

//---------------------------------------------------------

void(i=1); // 或如下语句:

void(i=1, i++);

2). number类型

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

JavaScript中总是处理浮点数,因此它没有象Delphi中的MaxInt这样的常量,反而是有这

样两个常值定义:

Number.MAX_VALUE : 返回 JScript 能表达的最大的数。约等于 1.79E+308。

Number.MIN_VALUE : 返回 JScript 最接近0的数。约等于 2.22E-308。

因为没有整型的缘故,因此在一些关于CSS和DOM属性的运算中,如果你期望取值为整数2,

你可能会得到字符串“2.0”——或者类似于此的一些情况。这种情况下,你可能需要用

到全局对象(Gobal)的parseInt()方法。

全局对象(Gobal)中还有两个属性与number类型的运算有关:

NaN : 算术表达式的运算结果不是数字,则返回NaN值。

Infinity : 比MAX_VALUE更大的数。

如果一个值是NaN,那么他可以通过全局对象(Gobal)的isNaN()方法来检测。然而两个NaN

值之间不是互等的。如下例:

//---------------------------------------------------------

// NaN的运算与检测

//---------------------------------------------------------

var

v1 = 10 * 'a';

v2 = 10 * 'a';

document.writeln(isNaN(v1));

document.writeln(isNaN(v2));

document.writeln(v1 == v2);

全局对象(Gobal)的Infinity表示比最大的数 (Number.MAX_VALUE) 更大的值。在JS中,

它在数学运算时的价值与正无穷是一样的。——在一些实用技巧中,它也可以用来做一

个数组序列的边界检测。

Infinity在Number对象中被定义为POSITIVE_INFINITY。此外,负无穷也在Number中被定

义:

Number.POSITIVE_INFINITY : 比最大正数(Number.MAX_VALUE)更大的值。正无穷。

Number.NEGATIVE_INFINITY : 比最小负数(-Number.MAX_VALUE)更小的值。负无穷。

与NaN不同的是,两个Infinity(或-Infinity)之间是互等的。如下例:

//---------------------------------------------------------

// Infinity的运算与检测

//---------------------------------------------------------

var

v1 = Number.MAX_VALUE * 2;

v2 = Number.MAX_VALUE * 3;

document.writeln(v1);

document.writeln(v2);

document.writeln(v1 == v2);

在Global中其它与number类型相关的方法有:

isFinite() : 如果值是NaN/正无穷/负无穷,返回false,否则返回true。

parseFloat() : 从字符串(的前缀部分)取一个浮点数。不成功则返回NaN。

3). boolean类型

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

(略)

4). string类型

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

JavaScript中的String类型原本没有什么特殊的,但是JavaScript为了适应

“浏览器实现的超文本环境”,因此它具有一些奇怪的方法。例如:

link() : 把一个有HREF属性的超链接标签<A>放在String对象中的文本两端。

big() : 把一对<big>标签放在String对象中的文本两端。

以下方法与此类同:

anchor()

blink()

bold()

fixed()

fontcolor()

fontsize()

italics()

small()

strike()

sub()

sup()

除此之外,string的主要复杂性来自于在JavaScript中无所不在的toString()

方法。这也是JavaScript为浏览器环境而提供的一个很重要的方法。例如我们

声明一个对象,但是要用document.writeln()来输出它,在IE中会显示什么呢?

下例说明这个问题:

//---------------------------------------------------------

// toString()的应用

//---------------------------------------------------------

var

s = new Object();

s.v1 = 'hi,';

s.v2 = 'test!';

document.writeln(s);

document.writeln(s.toString());

s.toString = function() {

return s.v1 + s.v2;

}

document.writeln(s);

在这个例子中,我们看到,当一个对象没有重新声明(覆盖)自己toString()方

法的时候,那么它作为字符串型态使用时(例如被writeln),就会调用Java Script

环境缺省的toString()。反过来,你也可以重新定义JavaScript理解这个对象

的方法。

很多JavaScript框架,在实现“模板”机制的时候,就利用了这个特性。例如

他们用这样定义一个FontElement对象:

//---------------------------------------------------------

// 利用toString()实现模板机制的简单原理

//---------------------------------------------------------

function FontElement(innerHTML) {

this.face = '宋体';

this.color = 'red';

// more...

var ctx = innerHTML;

this.toString = function() {

return '<Font FACE="' + this.face + '" COLOR="' + this.color + '">'

+ ctx

+ '</FONT>';

}

}

var obj = new FontElement('这是一个测试。');

// 留意下面这行代码的写法

document.writeln(obj);

5). function类型

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

javascript函数具有很多特性,除了面向对象的部分之外(这在后面讲述),它自

已的一些独特特性应用也很广泛。

首先javascript中的每个函数,在调用过程中可以执有一个arguments对象。这个

对象是由脚本解释环境创建的,你没有别的方法来自己创建一个arguments对象。

arguments可以看成一个数组:它有length属性,并可以通过arguments[n]的方式

来访问每一个参数。然而它最重要的,却是可以通过 callee 属性来得到正在执行

的函数对象的引用。

接下的问题变得很有趣:Function对象有一个 caller 属性,指向正在调用当前

函数的父函数对象的引用。

——我们已经看到,我们可以在JavaScript里面,通过callee/caller来遍历执行

期的调用栈。由于arguments事实上也是Function的一个属性,因此我们事实上也

能遍历执行期调用栈上的每一个函数的参数。下面的代码是一个简单的示例:

//---------------------------------------------------------

// 调用栈的遍历

//---------------------------------------------------------

function foo1(v1, v2) {

foo2(v1 * 100);

}

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有