JavaScript面向对象的支持(1)

发表于:2007-07-01来源:作者:点击数: 标签:
================================================================================ Qomolangma OpenProject v0.9 类别 :Rich Web Client 关键词 :JS OOP,JS Framwork, Rich Web Client,RIA,Web Component, DOM,DTHML,CSS,JavaScript,JScript 项

================================================================================
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。

 

[1]     

原文转自:http://www.ltesting.net