`
txf2004
  • 浏览: 6869291 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JS高级(2)

 
阅读更多

JS高级

1、 与Java 不同的还有变量可以存放不同类型的值

2、变量声明不是必须的,在用到的地方使用就可以

3、 5 种原始类型(primitivetype),即Undefined、Null、Boolean、Number和 String。

4、arguments 对象

arguments 对象

在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。

例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推)。

因此,无需明确命名参数,就可以重写函数:

function sayHi() {
 if (arguments[0] == "bye") {
 return;
 }

 alert(arguments[0]);
}

检测参数个数

还可以用 arguments 对象检测函数的参数个数,引用属性arguments.length 即可。

下面的代码将输出每次调用函数使用的参数个数:

function howManyArgs() {
 alert(arguments.length);
}

howManyArgs("string", 45);
howManyArgs();
howManyArgs(12);

上面这段代码将依次显示 "2"、"0"和 "1"。

注释:与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 25 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。

模拟函数重载

用 arguments 对象判断传递给函数的参数个数,即可模拟函数重载:

function doAdd() {
 if(arguments.length == 1) {
 alert(arguments[0] + 5);
 } else if(arguments.length == 2) {
 alert(arguments[0] + arguments[1]);
 }
}

doAdd(10); //输出 "15"
doAdd(40, 20); //输出 "60"

当只有一个参数时,doAdd() 函数给参数加 5。如果有两个参数,则会把两个参数相加,返回它们的和。所以,doAdd(10) 输出的是 "15",而 doAdd(40,20) 输出的是 "60"。

虽然不如重载那么好,不过已足以避开 ECMAScript 的这种限制。

4、闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

简单的闭包实例

在 ECMAScript 中使用全局变量是一个简单的闭包实例。请思考下面这段代码:

var sMessage = "hello world";

function sayHelloWorld() {
 alert(sMessage);
}

sayHelloWorld();

5、使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象。

ECMAScript 拥有很多创建对象或类的方法。

工厂方式

原始的方式

因为对象的属性可以在对象创建后动态定义,所有许多开发者都在 JavaScript 最初引入时编写类似下面的代码:

var oCar = new Object;
oCar.color = "blue";
oCar.doors = 4;
oCar.mpg = 25;
oCar.showColor = function() {
 alert(this.color);
};

TIY

在上面的代码中,创建对象 car。然后给它设置几个属性:它的颜色是蓝色,有四个门,每加仑油可以跑 25 英里。最后一个属性实际上是指向函数的指针,意味着该属性是个方法。执行这段代码后,就可以使用对象 car。

不过这里有一个问题,就是可能需要创建多个 car 的实例。

解决方案:工厂方式

要解决该问题,开发者创造了能创建并返回特定类型的对象的工厂函数(factory function)。

例如,函数 createCar() 可用于封装前面列出的创建 car 对象的操作:

function createCar() {
 var oTempCar = new Object;
 oTempCar.color = "blue";
 oTempCar.doors = 4;
 oTempCar.mpg = 25;
 oTempCar.showColor = function() {
 alert(this.color);
 };
 return oTempCar;
}

var oCar1 = createCar();
var oCar2 = createCar();

TIY

在这里,第一个例子中的所有代码都包含在 createCar() 函数中。此外,还有一行额外的代码,返回 car 对象(oTempCar)作为函数值。调用此函数,将创建新对象,并赋予它所有必要的属性,复制出一个我们在前面说明过的 car 对象。因此,通过这种方法,我们可以很容易地创建 car 对象的两个版本(oCar1 和 oCar2),它们的属性完全一样。

为函数传递参数

我们还可以修改 createCar() 函数,给它传递各个属性的默认值,而不是简单地赋予属性默认值:

function createCar(sColor,iDoors,iMpg) {
 var oTempCar = new Object;
 oTempCar.color = sColor;
 oTempCar.doors = iDoors;
 oTempCar.mpg = iMpg;
 oTempCar.showColor = function() {
 alert(this.color);
 };
 return oTempCar;
}

var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);

oCar1.showColor(); //输出 "red"
oCar2.showColor(); //输出 "blue"

TIY

给 createCar() 函数加上参数,即可为要创建的 car 对象的 color、doors 和 mpg 属性赋值。这使两个对象具有相同的属性,却有不同的属性值。

在工厂函数外定义对象的方法

虽然 ECMAScript 越来越正式化,但创建对象的方法却被置之不理,且其规范化至今还遭人反对。一部分是语义上的原因(它看起来不像使用带有构造函数 new 运算符那么正规),一部分是功能上的原因。功能原因在于用这种方式必须创建对象的方法。前面的例子中,每次调用函数 createCar(),都要创建新函数 showColor(),意味着每个对象都有自己的 showColor()版本。而事实上,每个对象都共享同一个函数。

有些开发者在工厂函数外定义对象的方法,然后通过属性指向该方法,从而避免这个问题:

function showColor() {
 alert(this.color);
}

function createCar(sColor,iDoors,iMpg) {
 var oTempCar = new Object;
 oTempCar.color = sColor;
 oTempCar.doors = iDoors;
 oTempCar.mpg = iMpg;
 oTempCar.showColor = showColor;
 return oTempCar;
}

var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);

oCar1.showColor(); //输出 "red"
oCar2.showColor(); //输出 "blue"

TIY

在上面这段重写的代码中,在函数 createCar() 之前定义了函数 showColor()。在 createCar()内部,赋予对象一个指向已经存在的 showColor() 函数的指针。从功能上讲,这样解决了重复创建函数对象的问题;但是从语义上讲,该函数不太像是对象的方法。

分享到:
评论

相关推荐

    javascript 高级 对象 object js

    javascript 高级 对象 object js

    JavaScript高级编程 pdf

    JavaScript高级编程 pdfJavaScript高级编程 pdfJavaScript高级编程 pdfJavaScript高级编程 pdf

    JS高级程序设计 电子版

    在本书中,我们将对 JavaScript 追根溯源,从它在最早的 Netscape 浏览器中诞生谈起,一直谈到今 天的它对 DOM 和 Ajax 的强大支持。读者将通过本书掌握如何运用和扩展这门语言,从而更好地满足自 己的需求,以及...

    W3C JavaScript 高级教程.rar

    本教程是 w3school JavaScript 教程的高级版本。 本教程从 JavaScript 的历史开始讲起,直到当前它对 XML 和 Web 服务的支持。 您将学习到如何扩展该语言,以使它适应特殊的需求。 您还将学到如何使用 JavaScript...

    JavaScript 高级编程

    很详细透彻的 javascript 网上收集 的 但是不知道是那本书 知道的告诉我下 我去买本 入门与提高 javascript教程 入门与提高 javascript教程入门与提高 javascript教程

    Javascript 高级程序设计(第3版)超清中文PDF

    Javascript 高级程序设计(第3版)超清中文PDF带目录完整版,个人的学习使用,共25M。

    Node.js高级编程.pdf

    Node.js是一种主流框架,它允许你使用JavaScript快速构建具有高度可伸缩性的网络程序。可是,它有自己的学习曲线,这本较为深入的指南性图书首先介绍了Node.js平台的安装,然后重点关注:创建和加载模块;使用缓冲区...

    Chapter3-《Ext JS高级程序设计》源代码

    《Ext JS高级程序设计》光盘源代码 今天才买的书,随书附带的光盘,压缩文件很大,所以分开压缩上传,一共有: Chapter3-《Ext JS高级程序设计》源代码.rar Chapter4-《Ext JS高级程序设计》源代码.rar Chapter5...

    js 高级程序设计

    JS高级程序设计,高清版PDF...《JavaScript高级程序设计》是2006年人民邮电出版社出版的图书,作者是(美)(Nicholas C.Zakas)扎卡斯。本书适合有一定编程经验的开发人员阅读,也可作为高校相关专业课程的教材。

    Chapter6-《Ext JS高级程序设计》源代码.rar

    《Ext JS高级程序设计》光盘源代码 今天才买的书,随书附带的光盘,压缩文件很大,所以分开压缩上传,一共有: Chapter3-《Ext JS高级程序设计》源代码.rar Chapter4-《Ext JS高级程序设计》源代码.rar Chapter5...

    javascript高级教程.pdf

    javascript高级教程

    Ext JS高级程序设计

    Ext JS高级程序设计.一共三章,三个文档。对extjs感兴趣的朋友共享

    javascript高级代码例子

    javascript高级代码例子

    javascript高级编程(第2版)pdf.part2

    javascript 高级编程 (第2版)pdf.part2

    js高级教你学好前端

    强化JavaScript,JavaScript 是因特网上最流行的脚本语言,它存在于全世界所有 Web 浏览器中,能够增强用户与 Web 站点和 Web 应用程序之间的交互。

    Javascript 高级编程第2版PDF part4

    本书在上一版基础上进行了大幅度更新和修订,融入了近几年来javascript应用发展的最新成果,几乎...从最佳编程实践到即将成为现实的api,直至javascript未来的发展,全景式地展示了javascript高级程序设计的方方面面。

    javascript高级编程.pdf

    javascript高级编程,包括语言概述,语言基础,事件处理,对象编程,文档对象模型,windows对象,document对象

    JavaScript高级教程(完整版)

    JavaScript高级教程,完整详细的讲解了JavaScript

    javascript高级编程ppt详细

    javascript高级编程ppt详细资料

    JavaScript_高级编程

    JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个...

Global site tag (gtag.js) - Google Analytics