javascript

位置:IT落伍者 >> javascript >> 浏览文章

Java应用:编写高级JavaScript应用代码[1]


发布日期:2022年04月17日
 
Java应用:编写高级JavaScript应用代码[1]

创建高级对象

使用构造函数来创建对象

构造函数是一个函数调用它来例示并初始化特殊类型的对象可以使用 new 关键字来调用一个构造函数下面给出了使用构造函数的新示例

var myObject = new Object(); // 创建没有属性的通用对象

var myBirthday = new Date( ); // 创建一个 Date 对象

var myCar = new Car(); // 创建一个用户定义的对象并初始化其属性

通过构造函数将一个参数作为特定的 this 关键字的值传递给新创建的空对象然后构造函数负责为新对象执行适应的初始化(创建属性并给出其初始值)完成后构造函数返回它所构造的对象的一个参数

编写构造函数

可以使用 new 运算符结合像 Object()Date() 和 Function() 这样的预定义的构造函数来创建对象并对其初始化面向对象的编程其强有力的特征是定义自定义构造函数以创建脚本中使用的自定义对象的能力创建了自定义的构造函数这样就可以创建具有已定义属性的对象下面是自定义函数的示例(注意 this 关键字的使用)

function Circle (xPoint yPoint radius) {

thisx = xPoint; // 圆心的 x 坐标

thisy = yPoint; // 圆心的 y 坐标

thisr = radius; // 圆的半径

}

调用 Circle 构造函数时给出圆心点的值和圆的半径(所有这些元素是完全定义一个独特的圆对象所必需的)结束时 Circle 对象包含三个属性下面是如何例示 Circle 对象

var aCircle = new Circle( );

使用原型来创建对象

在编写构造函数时可以使用原型对象(它本身是所有构造函数的一个属性)的属性来创建继承属性和共享方法原型属性和方法将按引用复制给类中的每个对象因此它们都具有相同的值可以在一个对象中更改原型属性的值新的值将覆盖默认值但仅在该实例中有效属于这个类的其他对象不受此更改的影响下面给出了使用自定义构造函数的示例Circle(注意 this 关键字的使用)

Circleprototypepi = MathPI;

function ACirclesArea () {

return thispi * thisr * thisr; // 计算圆面积的公式为 ?r

}

Circleprototypearea = ACirclesArea; // 计算圆面积的函数现在是 Circle Prototype 对象的一个方法

var a = ACirclearea(); // 此为如何在 Circle 对象上调用面积函数

使用这个原则可以给预定义的构造函数(都具有原型对象)定义附加属性例如如果想要能够删除字符串的前后空格(与 VBScript 的 Trim 函数类似)就可以给 String 原型对象创建自己的方法

// 增加一个名为 trim 的函数作为

// String 构造函数的原型对象的一个方法

Stringprototypetrim = function()

{

// 用正则表达式将前后空格

// 用空字符串替代

return thisreplace(/(^\s*)|(\s*$)/g );

}

// 有空格的字符串

var s = leading and trailing spaces ;

// 显示 leading and trailing spaces ()

windowalert(s + ( + slength + ));

// 删除前后空格

s = strim();

// 显示leading and trailing spaces ()

windowalert(s + ( + slength + ));

递归

递归是一种重要的编程技术该方法用于让一个函数从其内部调用其自身一个示例就是计算阶乘 的阶乘被特别地定义为 更大数的阶乘是通过计算 * * 来求得的每次增加 直至达到要计算其阶乘的那个数

下面的段落是用文字定义的计算阶乘的一个函数

如果这个数小于零则拒绝接收如果不是一个整数则将其向下捨入为相邻的整数如果这个数为 则其阶乘为 如果这个数大于 则将其与相邻较小的数的阶乘相乘

要计算任何大于 的数的阶乘至少需要计算一个其他数的阶乘用来实现这个功能的函数就是已经位于其中的函数该函数在执行当前的这个数之前必须调用它本身来计算相邻的较小数的阶乘这就是一个递归示例

递归和迭代(循环)是密切相关的 ? 能用递归处理的算法也都可以采用迭代反之亦然确定的算法通常可以用几种方法实现您只需选择最自然贴切的方法或者您觉得用起来最轻松的一种即可

显然这样有可能会出现问题可以很容易地创建一个递归函数但该函数不能得到一个确定的结果并且不能达到一个终点这样的递归将导致计算机执行一个无限循环下面就是一个示例在计算阶乘的文字描述中遗漏了第一条规则(对负数的处理) 并试图计算任何负数的阶乘这将导致失败因为按顺序计算 的阶乘时首先不得不计算 的阶乘然而这样又不得不计算 的阶乘如此继续很明显这样永远也不会到达一个终止点

因此在设计递归函数时应特别仔细如果怀疑其中存在着无限递归的可能则可以让该函数记录它调用自身的次数如果该函数调用自身的次数太多即使您已决定了它应调用多少次就自动退出

下面仍然是阶乘函数这次是用 JScript 代码编写的

// 计算阶乘的函数如果传递了

// 无效的数值(例如小于零)

// 将返回 表明发生了错误若数值有效

// 把数值转换为最相近的整数

// 返回阶乘

function factorial(aNumber) {

aNumber = Mathfloor(aNumber); // 如果这个数不是一个整数则向下捨入

if (aNumber < ) { // 如果这个数小于 拒绝接收

  return ;

}

if (aNumber == ) { // 如果为 则其阶乘为

return ;

}

else return (aNumber * factorial(aNumber )); // 否则递归直至完成

}

变量范围

JScript 有两种变量范围全局和局部如果在任何函数定义之外声明了一个变量则该变量为全局变量且该变量的值在整个持续范围内都可以访问和修改如果在函数定义内声明了一个变量则该变量为局部变量每次执行该函数时都会创建和破坏该变量且它不能被该函数外的任何事物访问

像 C++ 这样的语言也有块范围在这里任何一对{}都定义新的范围JScript 不支持块范围

一个局部变量的名称可以与某个全局变量的名称相同但这是完全不同和独立的两个变量因此更改一个变量的值不会影响另一个变量的值在声明局部变量的函数内只有该局部变量有意义

var aCentaur = a horse with rider; // aCentaur 的全局定义

// JScript 代码为简洁起见有省略

function antiquities() // 在这个函数中声明了一个局部 aCentaur 变量

{

// JScript 代码为简洁起见有省略

var aCentaur = A centaur is probably a mounted Scythian warrior;

// JScript 代码为简洁起见有省略

aCentaur += misreported; that is ; // 添加到局部变量

// JScript 代码为简洁起见有省略

} // 函数结束

var nothinginparticular = antiquities();

aCentaur += as seen from a distance by a naive innocent;

/*

在函数内该变量的值为 A centaur is probably a mounted Scythian warrior

misreported; that is 在函数外该变量的值为这句话的其余部分

a horse with rider as seen from a distance by a naive innocent

*/

[] []

               

上一篇:JavaScript:世界上误解最深的语言[1]

下一篇:Java应用:编写高级JavaScript应用代码[2]