关闭

关闭

封号提示

内容

首页 javascript面向对象编程.pdf

javascript面向对象编程.pdf

javascript面向对象编程.pdf

上传者: weidong1365381 2011-09-14 评分1 评论0 下载1160 收藏0 阅读量1218 暂无简介 简介 举报

简介:本文档为《javascript面向对象编程pdf》,可适用于IT/计算机领域,主题内容包含第一部分:现代JavaScript简介第一章现代JavaScript编程JavaScript的演化是渐进而稳固的。历经过去十年的进程JavaScri符等。

第一部分:现代JavaScript简介第一章现代JavaScript编程JavaScript的演化是渐进而稳固的。历经过去十年的进程JavaScript在人们的认知里已经从一门简单的玩物式的语言逐渐发展成为一门倍受推崇的编程语言被全世界的公司和开发者用来构造种种精彩的应用。现代JavaScript编程语言一如既往地可靠、健壮强大得令人难以置信。在本书中我进行的许多论述将揭示是什么使得现代JavaScript应用程序与从前有着那么明显的不同。本章中出现的许多概念远不能算新奇然而成千上万聪明的程序员的认同促使它们的用途得以升华并最终形成今天的格局。既如此我们这就来着眼现代JavaScript程序设计。面向对象的JavaScript从语言的视角来看面向对象的程序设计和面向对象的JavaScript语言绝对不是什么摩登的东西JavaScript最开始就是被设计成一种彻底的面向对象语言。然而随着JavaScript在其使用和接受的过程中的“逐步发展”其它语言(如Ruby,Python,和Perl等)的程序员留意到了它并开始将他们的编程模式引入了JavaScript。面向对象的JavaScript代码的外观和内部运作都有别于其它具有对象能力的语言。在第二章我将深入论述使它如此独特的方方面面而在这里先来看一点基础的东西以体会编写现代JavaScript代码的初步感觉。程序中的两个对象构造器的例子演示了可用于学校课程的简单的对象搭配。程序课程和课程表的面向对象JavaScript表述CODE:类Lecture的构造器使用两个字符串参数name和teacherfunctionLecture(name,teacher){把它们作为对象的本地属性保存thisname=namethisteacher=teacher}类Lecture的方法生成一个显示该课程信息的字符串Lectureprototypedisplay=function(){returnthisteacher"isteaching"thisname}类Schedule的构造器使用一个lectures类型的数组作为参数PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcnfunctionSchedule(lectures){thislectures=lectures}类Schedule的方法用来构造一个描述该课程表的字符串Scheduleprototypedisplay=function(){varstr=""遍历每门课程累加构成信息字符串for(vari=i<thislectureslengthi)str=thislecturesidisplay()""returnstr}从程序的代码中你或许已经看出大部分的面向对象基本原则贯穿存在于其中但它们是以不同于其它更常见的面向对象语言的方式组织起来的。你可以创建对象构造器和方法并存取对象属性。程序展示了在应用程序中使用上面两个类的一个示例。程序给用户提供课程的列表CODE:创建一个新的课表对象存于变量mySchedule中varmySchedule=newSchedule(创建一个课程对象的数组作为传给课表(原文此处为Lecture疑为笔误)对象的唯一参数newLecture("Gym","MrSmith"),newLecture("Math","MrsJones"),newLecture("English","TBD"))弹出对话框显示课表的信息alert(myScheduledisplay())伴随对广大程序员对JavaScript的接受设计良好的面向对象代码的使用也正日益普及。贯穿本书的始末我将试图展示我认为能够最好地例示代码设计与实现的不同的面向对象的JavaScript代码片段。测试你的代码建立起良好的面向对象的基本代码之后开发专业品质的JavaScript代码的第二个方面是确保拥有一个强劲的代码测试环境。当开发频繁使用的或将由其它开发者维护的代码时严格调试的必要性会显得尤为突出。为其它开发者提供一个坚实的测试基础是维持代码开发活动的关键。在第四章你将会看到一些可用来形成良好的测试使用框架的不同工具以及对复杂应用程序的简单调试。用于Firefox的插件Firebug就是其中一例。Firebug提供了许多的有PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn用的工具如错误控制台HTTP请求日志调试以及元素查看。图展示了Firebug调试一段代码时的实况截屏。图FirefoxFirebug插件运行时的截屏开发干净的、可测试的代码的重要性怎么强调都不会过分。一旦你开始开发一些干净的面向对象代码并将它们与合适的测试套件结合相信你会倾向于同意这一点。为分发而进行的封装开发现代的专业JavaScript代码的最后一个方面是为了代码分发或在现实世界里中使用而进行的封装处理。随着开始开发者们在其页面中使用越来越多的JavaScript代码冲突的可能性将会增加。如果两个JavaScript库里都有一个名为data的变量或者按各的意图添加事件灾难性的冲突和莫名其妙的错误可能就会出现。开发者简单地置入<script>指针无须任何变动就能正常工作的能力是开发一个成功的JavaScript库的精诣所在。开发者用以保持代码清洁和普遍兼容的的技术或解决方案有许多种。使用命名空间是广泛使用的保证代码不与其它JavaScript代码互相影响和抵触的一种技术。这方面一个极端的(但未必是最好或最有用的)运作中的例子就是Yahoo开发的任何人都可使用的用户界面库。使用该库的一个示例见程序程序使用重度名称空间化的YahooUI库给一个元素添加事件CODE:给ID为"body"的元素添加mouseover事件监听器YAHOOutilEventaddListener('body','mouseover',function(){andchangethebackgroundcoloroftheelementtoredthisstylebackgroundColor='red'})然而这种命名空间方法存在一个问题即库与库之间在构造和使用的方式上缺乏内在PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn的一致性。正是在这一点上中心代码仓库如JSAN(JavaScriptArchiveNetwork)变得非常有用。JSAN提供一套代码库需遵从的一致规则以及一种快捷导入代码所依赖的其它库的方式。图展示了JSAN的主分发中心的一个截屏。图公共代码仓库JSAN的截屏我将在第三章阐述开发清洁的可封装代码的细节。此外其它常见的事故多发点如事件处理冲突将在第六章论述。UnobtrusiveDOM脚本编程(非侵入的DOM脚本编程)基于一个优良的可测试的核心创建你的代码和兼容的分发是UnobtrusiveDOM脚本编程的基本概念。编写unobtrusive代码意味着与你的HTML内容的彻底分离:数据来自服务器而JavaScript代码用来使其动态化。达到这一彻底分离的最重要的副作用就是你的代码在不同的浏览器之间可以完美的升降级。利用这一点你可以提供高级的内容给支持它的浏览器而在不支持的浏览器上从容隐藏之。编写现代的、Unobtrusive代码包括两个方面:文档对象模型(DOM)和JavaScript事件。本书中我对这两个方面都将作深入的解释。PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn文档对象模型DOM是表示XML文档的流行的方法。它未必是最快的、最轻便的、或者最易使用的却是是最普及的绝大多数web开发语言(如JavaPerlPHPRubyPython及Javascript)都实现了对它的支持。DOM旨在为开发者提供一种直观的方式来导航于XML的层次结构中。因为有效的HTML只是XML的一个子集保有一个方式来有效地解析和浏览DOM文档对于简化JavaScript开发来说是必不可少的。从根本上讲出现在JavaScript中的大多数的交互是发生在JavaScript与页面所包含的不同HTML元素之间的DOM是使这此过程简单化的卓越工具。程序展示了使用DOM在页内导航和查找不同的元素然后操作它们的一些例子。程序使用文档对象模型定位并操纵不同的DOM元素CopytoclipboardCODE:<html><head><title>IntroductiontotheDOM<title><script>直到文档完全载入我们才能操作DOMwindowonload=function(){找到文档中所有的<li>元素varli=documentgetElementsByTagName("li")然后给它们全部加上边框for(varj=j<lilengthj){lijstyleborder="pxsolid#"}定位ID为'everywhere'的元素varevery=documentgetElementById("everywhere")并将它从文档中移除everyparentNoderemoveChild(every)}<script><head><body><h>IntroductiontotheDOM<h><pclass="test">ThereareanumberofreasonswhytheDOMisawesome,herearesome:<p><ul><liid="everywhere">Itcanbefoundeverywhere<li><liclass="test">It'seasytouse<li><liclass="test">Itcanhelpyoutofindwhatyouwant,PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcnreallyquickly<li><ul><body><html>DOM是开发UnobtrusiveJavaScript代码的第一步。借助简单快速导航HTML文档的能力所有随之而来的JavaScriptHTML交互将变得如此简单。事件事件将一个应用程序之内所有的用户交互结合在一起。在一个设计良好的JavaScript应用程序里你将拥有数据源和它的视觉的表示(在HTMLDOM内部)。为了同步这两个方面你必须监视用户的交互动作并试图相应地更新用户界面。使用DOM和JavaScript事件的结合是使得现代web应用程序赖以工作的基本组合。所有的现代浏览器都提供一系列的只要特定交互动作发生即被触发的事件如用户移动鼠标敲击键盘或离开页面等等。使用这些事件你可以注册代码到特定事件一旦该事件发生你的代码就会被执行。程序展示了这种交互的一个实例该网页中的<li>元素在用户鼠标经过的时候会改变背景色。程序使用DOM和事件来提供一些视觉效果CopytoclipboardCODE:<html><head><title>IntroductiontotheDOM<title><script>直到文档完全载入我们才能操作DOMwindowonload=function(){查找所有的<li>元素附以事件处理程序varli=documentgetElementsByTagName("li")for(vari=i<lilengthi){将鼠标移入事件处理程序附在<li>元素上该程序改变<li>背景颜色为蓝色liionmouseover=function(){thisstylebackgroundColor='blue'}将鼠标移出事件处理程序附在<li>元素上该程序将<li>的背景颜色改回白色liionmouseout=function(){thisstylebackgroundColor='white'}}PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn}<script><head><body><h>IntroductiontotheDOM<h><pclass="test">ThereareanumberofreasonswhytheDOMisawesome,herearesome:<p><ul><liid="everywhere">Itcanbefoundeverywhere<li><liclass="test">It'seasytouse<li><liclass="test">Itcanhelpyoutofindwhatyouwant,reallyquickly<li><ul><body><html>JavaScript事件是复杂多样的。本书中的大多数代码或应用程序都以某种方式利用了事件。第六章和附属B完全专注于事件及其交互。JavaScript与CSS动态HTML建立在DOM和事件交互的基础上。在核心层面上动态HTML表示发生在JavaScript和附着在DOM元素上的CSS信息的交互。层叠式样式表(CSS)作为布局的标准服务于简单的不唐突的网页在最小化了用户端兼容性问题的同时提供给开发者以强大的可控制性。从根本上讲动态HTML就是探索JavaScript和CSS彼此交互作用时能够达到什么以及怎样最好地利用该联合达成令人印象深刻的效果。更高级的交互示例如拖放元素和动画效果见第七章。在那里我将围绕它们展开深入论述。AjaxAjax或曰异步Javascript与XML是由AdaptivePath公司的创办人之一兼董事长JesseJamesGarrett在其论文"Ajax:Web应用程序的新途径"(http:wwwadaptivepathcompublarchivesphp)中创造的一个术语。它描述了请求和提交额外的信息时发生于客户和服务器之间的高级交互。术语Ajax包括了许多种数据据通讯的可能组合但它们都围绕一个中心前提:附加的数据请求是在页面完全载入之后由客户端向服务器发起的。这允许应用程序开发者超越缓慢的、传统的应用程序流程创建与用户相关的额外交互。图是来自Garrett的Ajax论文的一个图示说明了应用程序中由于额外的请求发生在后台(而且用户很可能并不知情)交互的流程发生了怎样的改变。PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn图:来自文章"Ajax:Web应用程序的新途径"的图示展示发生于客户和服务器之间的先进的异步的交互Garrett论文的最初发表激起了用户、开发者、设计者以及管理者们的兴趣使用高级交互的新型应用程序爆炸式地增长。讽刺的是在这一兴趣复苏的同时Ajax背后的技术却是相当陈旧的(在年左右就有已有了商业上的应用)。然而最主要的不同在于老的应用程序利用了浏览器特有的方式与服务器通讯(如仅ie具有的功能)。由于所有的现代浏览器都支持XMLHttpRequest(发送或从服务器接收数据的主要手段)theplayingfieldhasbeenleveled(见#cfs的回复)每个人都可以享受其益处。如果说有一个公司走在了利用Ajax技术创建优秀应用程序的最前列那无疑是Google。恰在最初的Ajax论文出现之前它发布了一个高交互性的domo:GoogleSuggest。该demo可以实时地自动完成你所键入的查询这是旧式的页面重载不可能达到的功能。图是GoogleSuggest运行时的一个截屏。PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn图GoogleSuggest早于Garrett的Ajax论文的利用了异步XML技术的应用程序除此而外Google的另一个革命性的应用程序为GoogleMap用户在其地图上移动将会实时地看到相关的局部结果。这一程序通过使用Ajax技术而提供的速度和可用性的水平是其它任何可用的地图程序所无法比拟的结果彻底地变革了在线地图市场。图是GoogleMap的截屏图GoogleMaps利用了一些Ajax技术来动态载入特定区域信息PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn浏览器支持JavaScript开发所面临的不幸事实是因为与实现和支持它的浏览器关联过于紧密它受到当前最流行浏览器的支配。由于用户未必会使用对JavaScript支持得最好的浏览器我们被迫对哪些是最重要的功能作出抉择。许多开发者已经开始做的是去掉对那些导致过多开发障碍的浏览器的支持。因为它们用户群的规模和还是因为它们拥有你喜欢的功能而考虑对浏览器的支持需要仔细的权衡。最近Yahoo发布了一个可用来扩展你的web应用程序的JavaScript库。连同那个库它还发布了一些供web开发者遵从的指导方针。以我之见从中产生的最重要的文档是Yahoo支持与不支持的各种浏览器的官方的列表。尽管任何人或任何公司都可以做类似的事情一份由互联上访问最频繁的网站所提供的文档其价值绝对无法估量。Yahoo开发了一个分级的浏览器支持策略对浏览器指定特定的级别并依据其功能为它提供不同的内容。Yahoo给浏览器三个级别:A,X和C:A级浏览器是得到完全支持和测试的Yahoo的所有程序都能有保障在其中运行。X级浏览器是Yahoo认可但是没能彻底测试的准A级浏览器或者是崭新的从未遇到过的浏览器。X级浏览器被期望能处理高级的内容与A级浏览器等同对待。C级浏览器是已知的“劣质的”浏览器不支持运行Yahoo应用程序所必须的功能。由于Yahoo应用程序完全Unobtrusive(即使没有JavaScript它们也能继续工作)这些浏览器只需处理不含JavaScript的功能性的内容。顺便一提Yahoo的浏览器级别选择竟与我的不谋而合这使得它尤其富有吸引力。在这本书里我大量地使用了术语“现代浏览器”当我用这一措词的时候我指的Yahoo浏览器分级表评定为A级的任浏览器。给定一组赖以工作的一致的功能减少因避免浏览器的不兼容而带来的痛苦学习和开发的经历将会变得更加有趣。我极力推荐你们去通读浏览器分级的支持文档(见http:developeryahoocomyuiarticlesgbsgbshtml该文档包含了图所示的浏览器支持表)感受一下Yahoo力图实现的是什么。通过将些信息公之于web开发的大众Yahoo正在给出一条无价的“黄金标准”让其它所有人去靠拢这是很了不起的。PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn图Yahoo提供的浏览器分组支持表更多的关于浏览器支持情况的信息请参看本书的附录C那里对每种浏览器的缺点和长处都有深入的论讨。或多或少地你会发现所有的A级浏览器都走在发展的最前列提供了远远超出你的开发所需要的功能。当选择你希望支持哪些浏览器时最终结果实际上可以归结为你的应用程序支持的一组功能。如果你想要支持NS或IE(举个例子来说)则势必严格地限制你可以在程序中使用的功能的数量因为它们缺乏对现代编程技术的支持。尽管如此了解哪些浏览器是现代的允许你利用其中可用的强大的功能并给你一个可供将来的开发所依据的稳固的基础。这一稳固的开发基础可由以下几种功能所定义:核心Javascript:最近、最广泛接受的JavaScript版本。它全面支持面向对象的JavaScript。IE不支持全部的这是开发者们不愿意支持它的主要原因。XML文档对象模型(DOM):用来访问HTML和XML文档的的标准方案。这绝对是编写高效率的程序不可或缺的。XMLHttpRequest:Ajax技术的支柱用来发起HTTP请求的一个简单层。所有的浏览器默认都支持这一对象除了IE而它们也都支持用ActiveX初始化功能相当的对象。CSS:网页设计的基本需求。这似乎像是一个额外的需求但是拥有CSS对web应用程序开发者来说是必不可少的。由于每一种现代浏览器都支持CSS大多数问题的发生通常归结为呈现方面的差异。这正是IEforMac较少被频繁支持的主要原因。以上这些浏览器功能的结合构成了开发JavaScriptweb应用程序的支柱。所有的现代浏览器都以某种方式支持以上列举的功能。本书论述的所有内容都基于这一假设:你所使用的浏览器最起码能支持它们本章摘要本书试图完全包括所有现代、专业的JavaScript编程技术以期它们被从独立开发者到大型公司的每一个人使用使得其代码更加可用、可读、具有交互性。PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn在这一章里我们对这本书里将会出现的每一个知识点做了一个简短的总览。这包括专业JavaScript编程的基础:编写面象对代码测试代码为分发而进行封装。随后你看到了UnobtrusiveDOM脚本编程的主要方面包括一个关于文档对象模型事件JavaScript与CSS交互的简短的总览。最后你看到了Ajax背后的前提和在现代浏览器中JavaScript的支持。这些话题加在一起足够带你步入专业级JavaScript程序员的行列。第二部分专业的JavaScript开发第二章面对对象的JavaScript对象是JavaScript的基本单位。实际上JavaScript中一切都是对象并得益于这一事实。然而为了增强这一纯粹的面向对象的语言JavaScript包括了一个庞大的功能集使它无论是在潜在能力还是风格上都成为一门极其独特的语言。本章中我将开始覆盖JavaScript语言的最重要的一些方面如引用作用域闭包以及上下文你会发现这正是其它JavaScript书籍中很少论及的。打下主要的基础以后我们将开始探索面向对象JavaScript的几个重点包括对象到底如何运作和怎样创建新的对象并在特定的许可条件下设置其方法。如果你认真去读的话这很可能是本书中最重要的一章它将彻底地改变你看待JavaScript作为一门编程语言的方式。语言特性引用JavaScript的一个重要的方面是引用的概念。引用就是指向对象实际位置的指针。这是一项极其强大的功能。前提是实际的对象决不是一个引用:字符串总是一个字符串数组总是一个数组。然而多个变量可以引用相同的对象。JavaScript就是以这种引用引用机制为基础。通过维护一系列的指向其它对象的引用语言为你提供了更大的弹性。另外对象能包括一系列的属性这些属性简单地引用其它对象(如字符串数字数组等等)。当几个变量指向相同对象时修改底层对象类型将会在所有的指点向它的变量上有所反映。例即此一例两个变量指向同一个对象但是对对象内容的修改的反映是全局的。程序多变量引用单个对象的示例CopytoclipboardCODE:设置obj为一个空对象varobj=newObject()objRef现在引用了别的对象varobjRef=obj修改原始对象的属性PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcnobjoneProperty=true我们可以发现该变化在两个变量中都可以看到(因为他们引用了同一个对象)alert(objoneProperty===objRefoneProperty)我从前提到过自更改的对象在JavaScript里非常少见的。让我们看一个发生这一状况的实例。数组对象能够用push方法给它自己增加额外的项。因为在数组对象的核心值是作为对象的属性存储的结果类似程序中的情形一个对象成为全局被改动的(导致了多个变量的值被同时改变)。见程序程序自修改对象的例子CopytoclipboardCODE:创建一组项目的数组varitems=newArray("one","two","three")创建一个对项目数组的引用varitemsRef=items给原始数组添加一项itemspush("four")两个数组的长度应该相同因为它们都指向相同的数组对象alert(itemslength==itemsReflength)记住这一点是很重要的:引用总是只指向最终被引用的对象而不会是引用本身。例如在Perl语言里很可能有一个引用指向另一个也是引用的变量。但在JavaScript里它会沿着引用链向下追溯直到指向核心的对象。程序演示了这种情形物理的目标已经改变而引用仍然指向原来的对象。程序ChangingtheReferenceofanObjectWhileMaintainingIntegrity(见#oerrite的回复)CopytoclipboardCODE:设置items为一个字符串的数组(对象)varitems=newArray("one","two","three")设置itemsRef为对items的引用varitemsRef=items让items指向一个新的对象items=newArray("new","array")items和itemsRef现在指向不同的对象items指向newArray("new","array")itemsRef则指向newArray("one","two","three")alert(items!==itemsRef)PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn最后让我们来看一个陌生的例子表面似乎是一个自修改的对象却作用于一个新的未被引用的对象。当执行字符串串联时结果总是一个新的字符串对象而非原字符串更改后的版本。这在程序中可以看出。程序对象修改作用于一个新的对象而非自修改对象的示例CopytoclipboardCODE:让item等于一个新的字符串对象varitem="test"itemRef也引用相同的字符串对象varitemRef=item在字符串对象上串联一个新的对象注意:这创建了一个新的对象并不修改初始对象item="ing"item和itemRef的值并不相等因为一个全新的对象被创建了alert(item!=itemRef)如果你刚刚接触引用可能是个令人头大的刁钻话题。然而理解引用是如何工作的对于编写良好、干净的JavaScript代码是极其重要的。接下来的几节我们将探究几种未必新鲜和令人激动的但是同样对编写良好、干净的代码很重要的特性。函数重载和类型检查其它面向对象的语言(比如Java)的一种共有的特性是“重载”函数的能力:传给它们不同数目或类型的参数函数将执行不同操作。虽然这种能力在JavaScript中不是直接可用的一些工具的提供使得这种探求完全成为可能。在JavaScript的每一个函数里存在一个上下文相关的名为arguments的变量它的行为类似于一个伪数组包含了传给函数的所有参数。参数不是一真正的数组(意味着你不能修改它或者调用push()方法增加新的项)但是你可以以数组的形式访问它而且它也的确有一个length属性。程序中有两个示例。程序JavaScript中函数重载的两个示例CopytoclipboardCODE:一个简单的用来发送消息的函数functionsendMessage(msg,obj){如果同时提供了一个消息和一个对象if(argumentslength==)就将消息发给该对象objhandleMsg(msg)PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn否则刚假定只有消息被提供else于是显示该消息alert(msg)}调用函数带一个参数–用警告框显示消息sendMessage("Hello,World!")或者我们也可以传入我们自己的对象用一种不同方式来显示信息sendMessage("Howareyou",{handleMsg:function(msg){alert("Thisisacustommessage:"msg)}})一个使用任意数目参数创建一个数组的函数functionmakeArray(){临时数组vararr=遍历提交的每一个参数for(vari=i<argumentslengthi){arrpush(argumentsi)}返回结果数组returnarr}另外存在另一种断定传递给一个函数的参数数目的方法。这种特殊的方法多用了一点点技巧:我们利用了传递过来的任何参数值不可能为undefined这一事实。程序展示一了个简单的函数用来显示一条错误消息如果没有传给它则提供一条缺省消息。程序:显示错误消息和缺省消息CopytoclipboardCODE:functiondisplayError(msg){检查确保msg不是undefinedif(typeofmsg=='undefined'){如果是则设置缺省消息msg="Anerroroccurred"}显示消息alert(msg)}PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcntypeof语句的使用引入了类型检查。因为JavaScript(目前)是一种动态类型语言使得这个话题格外有用而重要的话题。有许多种方法检查变量的类型我们将探究两种特别有用的。第一种检查对象类型的方式是使用显式的typeof操作符。这种有用的方法给我们一个字符串名称代表变量内容的类型。这将是一种完美的方案除非变量的类型或者数组或自定义的对象如user(这时它总返回"ojbect"导致各种对象难以区分)。这种方法的示例见程序程序使用typeof决定对象类型的示例CopytoclipboardCODE:检查我们的数字是否其实是一个字符串if(typeofnum=="string")如果是则将它解析成数字num=parseInt(num)检查我们的数组是否其实是一个字符串if(typeofarr=="string")如果是则用逗号分割该字符串构造出一个数组arr=arrsplit(",")检查对象类型的第二种方式是参考所有JavaScript对象所共有的一个称为constructor的属性。该属性是对一个最初用来构造此对象的函数的引用。该方法的示例见程序。程序使用constructor属性决定对象类型的示例CopytoclipboardCODE:检查我们的数字是否其实是一个字符串if(numconstructor==String)如果是则将它解析成数字num=parseInt(num)检查我们的字符串是否其实是一个数组if(strconstructor==Array)如果是则用逗号连接该数组得到一个字符串str=strjoin(',')表显示了对不同类型对象分别使用我所介绍的两种方法进行类型检查的结果。表格的第一列显示了我们试图找到其类型的对象。每二列是运行typeofVariable(Variable为第一列所示的值)。此列中的所有结果都是字符串。最后第三列显示了对第一列包含的对象运行Variableconstructor所得的结果。些列中的所有结果都是对象。表变量类型检查VariabletypeofVariableVariableconstructorPDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn{an:"object"}objectObject"an","array"objectArrayfunction(){}functionFunction"astring"stringStringnumberNumbertruebooleanBooleannewUser()objectUser使用表的信息你现在可以创建一个通用的函数用来在函数内进行类型检查。可能到现在已经明显使用一个变量的constructor作为对象类型的引用可能是最简单的类型检查方式。当你想要确定精确吻合的参数数目的类型传进了你的函数时严格的类型检查在这种可能会大有帮助。在程序中我们可以看到实际中的一例。程序一个可用来严格维护全部传入函数的参数的函数CopytoclipboardCODE:依据参数列表来严格地检查一个变量列表的类型functionstrict(types,args){确保参数的数目和类型核匹配if(typeslength!=argslength){如果长度不匹配则抛出异常throw"InvalidnumberofargumentsExpected"typeslength",received"argslength"instead"}遍历每一个参数检查基类型for(vari=i<argslengthi){如JavaScript某一项类型不匹配则抛出异常if(argsiconstructor!=typesi){throw"InvalidargumenttypeExpected"typesiname",received"argsiconstructorname"instead"}}}用来打印出用户列表的一个简单函数functionuserList(prefix,num,users){确保prefix是一个字符串num是一个数字且user是一个数组strict(String,Number,Array,arguments)循环处理num个用户for(vari=i<numi){PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcn显示一个用户的信息print(prefix":"usersi)变量类型检查和参数长度校验本身是很简单的概念但是可用来实现复杂的方法给开发者和你的代码的使用者提供更好的体验。接下来我们将探讨JavaScript中的作用域以及怎么更好的控制它。作用域作用域是JavaScript中一个较难处理的特性。所有面向对象的编程语言都有某种形式的作用域这要看是什么上下文约束着作用域。在JavaScript里作用域由函数约束而不由块约束(如while,if,和for里的语句体)。最终可能使得一些代码的运行结果表面上显得怪异(如果你来自一种块作用域语言的话)。程序的例子说明了“函数作用域代码”的含义。代码JavaScript中变量作用域是怎样工作的例子CopytoclipboardCODE:设置一个等于"test"的全局变量foovarfoo="test"在if块中if(true){设置foo为"newtest"注意:这仍然是在全局作用域中varfoo="newtest"}正如我们在此处可见foo现在等于"newtest"alert(foo=="newtest")创建一个修改变量foo的函数functiontest(){varfoo="oldtest"}调用时foo却驻留在是在函数的作用域里面test()确认一下foo的值仍然是"newtest"alert(foo=="newtest")在程序中你会发现变量位于在全局作用域。基于浏览器的JavaScript有趣的一面是所有的全局变量实际上都是window对象的属性。尽管一些老版本的Opera浏览器或Safari浏览器不是这样假定浏览器这样工作通常是一个很好的经验规则。程序展示了一个这种例子。程序JavaScript的全局变量与window对象的例子PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcnCopytoclipboardCODE:全局变量包含字符串"test"vartest="test"你会发现我们的全局变量和window的test属性是相同的alert(windowtest==test)最后让我们来看看当一个变量漏定义时会怎样。程序里变量foo在test()的作用域里被赋值。但是程序里实际并没有(用varfoo)定义变量的作用域。当变量foo没有明确定义时它将成为全局变量即使它只在函数的上下文使用。程序隐式全局变量声明的示例CopytoclipboardCODE:一个为变量foo赋值的函数functiontest(){foo="test"}调用函数为foo赋值test()我们发现foo现在是全局变量了alert(windowfoo=="test")到目前应该很明显尽管JavaScript的作用域不如块作用域语言的严格它还是相当强大和有特色的。尤其是与下节中叙述的闭包的概念结合起来时JavaScript语言的强大将展露无遗。闭包闭包意味着内层的函数可以引用存在于包绕它的函数的变量即使外层的函数的执行已经终止。这一特殊的论题可能是非常强大又非常复杂的。我强烈推荐你们参考本节后面将提及的站点因为它有一些关于闭包这一话题的精彩的信息。我们先来看程序所示的闭包的两个简单例子。程序闭包改善的代码清晰性的两例CopytoclipboardCODE:得到id为"main"的元素varobj=documentgetElementById("main")改变它的边框样式objstyleborder="pxsolidred"初始化一个秒钟以后被调用的回调函数PDF文件使用"pdfFactoryPro"试用版本创建wwwfineprintcnsetTimeout(function(){此函数将隐藏该元

类似资料

编辑推荐

现代西方哲学 下.pdf

西方哲学初步.pdf

物业管理公司楼宇巡查管理规定WI-NWGZ-AL.KF-03-08.doc

物业管理公司楼宇接管验收情况检查表WI-NWGZ-AL.KF-06-08.doc

[语法讲义].朱德熙.扫描版.pdf

职业精品

精彩专题

结婚彩礼真有那么重要吗?

原创于西周而后沿袭至今的彩礼,虽然被一部分家长奉为圭臬,但越来越多的年轻人对结婚必须要彩礼不以为然。彩礼引发的社会矛盾越来越受到关注,结婚是自己的事,如人饮水冷暖自知,至于要不要彩礼或者要多少彩礼,因人而异,因财力而已,不可一概而论。

用户评论

0/200
    暂无评论
上传我的资料

精选资料

热门资料排行换一换

  • 中国戏剧史新论.pdf

  • 谋杀与文明_对几则神话的阅读札记…

  • 中国戏剧史略.pdf

  • 中国戏剧简史.pdf

  • 选矿机械设备安装、调试、运行、操…

  • 我的预测方法的要素和几何角度线-…

  • 妇产科三基考试试题及答案.doc

  • 素描教案1.ppt

  • 大学心理学课件___第十章_情绪…

  • 资料评价:

    / 150
    所需积分:1 立即下载

    意见
    反馈

    返回
    顶部