<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>冰剑'blog - 技术文档</title><link>http://www.xunzou.com/blog/</link><description>专注于WEB前端开发 | 2010 重生 - </description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 91204</generator><language>zh-CN</language><copyright>Copyright 2010 xunzou.com. Rights Reserved.备案序号:豫ICP备05003168号var gaJsHost = ((&amp;quot;https:&amp;quot; == document.location.protocol) ? &amp;quot;https://ssl.&amp;quot; : &amp;quot;http://www.&amp;quot;);document.write(unescape(&amp;quot;%3Cscript src='&amp;quot; + gaJsHost + &amp;quot;google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E&amp;quot;));try {var pageTracker = _gat._getTracker(&amp;quot;UA-11478901-1&amp;quot;);pageTracker._trackPageview();} catch(err) {}</copyright><pubDate>Thu, 09 Sep 2010 00:15:54 +0800</pubDate><item><title>国内微博现状分析及微博流行的原因</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/604.html</link><pubDate>Wed, 24 Feb 2010 15:28:33 +0800</pubDate><guid>http://www.xunzou.com/blog/post/604.html</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;微博：微博即微型博客，是Web3.0新兴起的一类开放互联网社交服务，国际上最知名的微博网站是<a target="_blank" href="http://www.Twitter.com">Twitter</a>（国内无法访问），目前<a target="_blank" href="http://www.Twitter.com">Twitter</a>的独立访问用户已达3200万，美国总统奥巴马、美国白宫、FBI、Google、HTC、DELL、福布斯、通用汽车等很多国际知名个人和组织在<a target="_blank" href="http://www.Twitter.com">Twitter</a>上进行营销和与用户交互。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;目前，国内兴起了一阵微博热，继之前一批独立微博：如饭否（已闭关）、叽歪等，新浪（Sina）于2009年8月份也在国内各大门户网站中率先推出了<a target="_blank" href="http://t.sina.com.cn">新浪微博</a>，它的营销模式也采用了和它推出博客时候的一样&mdash;&mdash;用名人效应，不过也起来了一些作用。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;继新浪（Sina）推出<a target="_blank" href="http://t.sina.com.cn">新浪微博</a>之后，各大门户网站也坐不住了，好像微博成了每个网站的标准配置一样。搜狐（Sohu）和网易（163）相继也在2009年末2010年初推出微博产品。腾讯在在2010年年初推出了腾讯微博的访问地址，只是到现在还是在等待中的图片，尚未开始测试。</p><p>&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://t.sina.com.cn">新浪微博</a>起初进行的是邀请制，网易现在也是邀请码注册，搜狐的则是与搜狐博客紧密结合，只要是搜狐博客用户则可体验。腾讯的目前尚未开始测试。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;微博之所以流行，主要是因为微博用户是主动去接受信息，并且有选择性的接受信息。为什么有些人会迷上微博，比如我，哈哈。主要有三方面的原因：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;首先这里有你想关注的人或者信息；</p><p>&nbsp;&nbsp;&nbsp;&nbsp;其次，你所发表的信息能够让关注你的人或者你的朋友看到；</p><p>&nbsp;&nbsp;&nbsp;&nbsp;最后，通过这些简短的文字，能够让你和关注的人、和朋友互动。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;在微博里你发表的是自己的即时心情，让你的朋友能够随时看到你的状态。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;发表微博相对于发表博客来说更快捷，更方便。但是也有有些弊端，比如它的信息是即时的、更新较快、过后虽然通过搜索还可以找到，可用性也是当下的。</p><p>参考网站：<a href="http://baike.baidu.com/view/1567099.htm" target="_blank">http://baike.baidu.com/view/1567099.htm</a></p>]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/604.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=604</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=604&amp;key=f3aaaf4e</trackback:ping></item><item><title>在win2003下安装dreamweaver cs4 和photoshop4的方法</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/573.html</link><pubDate>Thu, 04 Jun 2009 14:47:51 +0800</pubDate><guid>http://www.xunzou.com/blog/post/573.html</guid><description><![CDATA[今天重新装了系统，是2003的，安装dreamweaver cs4 时出现问题，不让安装！<br/>从网上找了一下，只找到了adobe photoshop 不能安装的解决方案：<br/><blockquote><div class="quote"><br/>安装光盘中找到payloads文件夹-->AdobePhotoshop10zh_CN-->AdobePhotoshop10zh_CN.proxy.xml<br/>对了，就是这个文件,用Dreamweaver打开他(记事本也行),文件比较大，打开很慢，在文件的最后有一段代码:<br/><br/>对了，就是这个文件,用Dreamweaver打开他(记事本也行),文件比较大，打开很慢，在文件的最后有一段代码:<br/>{"OS":{"Macintosh":{"Require":[{"Version":"10.4.8"}],"Exclude":[{"Version":"10.4.8"}]},"Windows":{"XP":{"Exclude":true,"Require":{"MinServicePack":"2","@servicePack64Bit":1<br/>,"Need64Bit":"0"}},"Server2003":{"Exclude":true},"Vista":{"Require":true}}} }<br/>]</SystemRequirementsJSON><br/></PayloadInfo><br/>大家看到没有，这里就是安装程序对系统的要求设置，Mac系统要10.4.8才能安装，XP允许，但至少要sp2才能安装,server2003不给安装，vista给安装,教大家怎么在win2003安装:  "Server2003":{"Exclude":true},<br/>改为       "Server2003":{"Require":true},XP SP1安装:    MinServicePack": "2"改为 MinServicePack":"1"<br/>这样修改后，保存下，关闭，即可正常安装了<br/></div></blockquote><br/><br/>我就试着吧这个方法用在DreamWeaver cs4里面，竟然可以用！<br/>不过安装它的时候要先在hosts文件添加下面的东西：<br/>127.0.0.1       activate.adobe.com<br/>127.0.0.1       practivate.adobe.com<br/>127.0.0.1 activate.adobe.com<br/>127.0.0.1 practivate.adobe.com<br/>127.0.0.1 ereg.adobe.com<br/>127.0.0.1 activate.wip3.adobe.com<br/>127.0.0.1 wip3.adobe.com<br/>127.0.0.1 3dns-3.adobe.com<br/>127.0.0.1 3dns-2.adobe.com<br/>127.0.0.1 adobe-dns.adobe.com<br/>127.0.0.1 adobe-dns-2.adobe.com<br/>127.0.0.1 adobe-dns-3.adobe.com<br/>127.0.0.1 ereg.wip3.adobe.com<br/>127.0.0.1 activate-sea.adobe.com<br/>127.0.0.1 wwis-dubc1-vip60.adobe.com<br/>127.0.0.1 activate-sjc0.adobe.com<br/>注册码：<br/>1192-1413-8739-4724-1366-4303<br/><br/>2.photoshop cs4 需要找到Adobe CS4\payloads\AdobePhotoshop11-Driver目录下的AdobePhotoshop11-Driver.proxy.xml<br/><br/>记事本打开最后加上："Server2003":{"Require":true},<br/><br/>的注册码：1330-1013-9701-0823-9348-7240 or 1330-1537-0384-0164-5110-0609<br/><br/>安装就可以了！]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/573.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=573</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=573&amp;key=266f10f0</trackback:ping></item><item><title>FLV在线flash播放器JW PLAYER</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/567.html</link><pubDate>Tue, 19 May 2009 15:59:25 +0800</pubDate><guid>http://www.xunzou.com/blog/post/567.html</guid><description><![CDATA[JW PLAYER 是一个界面简洁、功能齐全的在线flv flash播放器.有着很多可选控制参数。<br/>多个参数可以混合使用,下面选择几个作简要说明：<br/>file  (FLV文件的地址，如果不设置则默认为jw player flv网页播放器同目录的video.flv)<br/>autostart (是否允许自动播放，"true"或者"false")<br/>image (未播放时的预览图片，只支持JPEG格式)<br/>repeat (是否重复播放)<br/>clicktext (开始时显示的文字，默认是"click to play")<br/><br/>flv网页播放器JW Player下载：<a href="http://www.xunzou.com/blog/uploads/200905/flv_player_jw_player.zip" target="_blank">点这里下载</a><br/>flv网页播放器JW Player官方网站：http://www.longtailvideo.com/players/jw-flv-player/<br/><br/>从枰下载的最新版本flv网页播放器调用说明：<br/> <script type="text/javascript" src="swfobject.js"></script><br/> <script type="text/javascript"><br/>  var s1 = new SWFObject("player.swf","ply","190","180","0","#FFB901");<br/>  s1.addParam("allowfullscreen","true");<br/>  s1.addParam("allowscriptaccess","always");<br/>  s1.addParam("flashvars","file=/flv/video.flv&image=/flv/preview.jpg&autostart=true");<br/>  s1.write("container");<br/> </script><br/><br/>说明：<br/>autostart=true是设置自动播放，如果把true改为flash则不自动播放。<br/>file=/flv/video.flv是设置播放flv文件的位置。<br/>image=/flv/preview.jpg是设置未播放时的预览图片，只支持JPG的图片。<br/><br/>flv网页播放器JW Player使用说明(适用旧版本)：<br/><br/>一般调用程序代码<br/><object type="application/x-shockwave-flash" width="400" height="220"  wmode="transparent" data="flvplayer.swf"><br/>       <param name="movie" value="flvplayer.swf" /><br/>       <param name="wmode" value="transparent" /><br/><object/><br/><br/>flvplayer.swf会自动找到同一目录内的video.flv播放。也可以在flvplayer.swf后添加FLV文件的URL来进行播放。方法如下：<br/><br/>程序代码<br/><object type="application/x-shockwave-flash" width="400" height="220" wmode="transparent" data="flvplayer.swf?file=movies/holiday.flv"><br/>       <param name="movie" value="flvplayer.swf?file=movies/holiday.flv" /><br/>       <param name="wmode" value="transparent" /><br/></object><br/><br/>file=movies/holiday.flv就是参数,可以使用相对或者绝对地址。<br/><br/>其他参数说明：如果载入影片时不需要自动播放,可以使用autostart参数<br/><br/>例子<br/><object type="application/x-shockwave-flash" width="400" height="220"<br/>       wmode="transparent" data="flvplayer.swf?autostart=false"><br/>       <param name="movie" value="flvplayer.swf?autostart=false" /><br/>       <param name="wmode" value="transparent" /><br/></object>]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/567.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=567</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=567&amp;key=bf33e6f5</trackback:ping></item><item><title>flash加链接的方法</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/547.html</link><pubDate>Fri, 17 Apr 2009 10:50:32 +0800</pubDate><guid>http://www.xunzou.com/blog/post/547.html</guid><description><![CDATA[本文主要讲述flash as2和as3里面加链接的方法！<br/><font color="White">转载请注明来自</font><a href="http://www.xunzou.com/blog/" target="_blank"><font color="White">http://www.xunzou.com/blog/</font></a><br/><font color="White">本文地址：</font><a href="http://www.xunzou.com/blog/article.asp?id=594" target="_blank"><font color="White">http://www.xunzou.com/blog/article.asp?id=594</font></a><br/><br/>好久没有动过flash了，今天公司做flash的一个小伙临时有事出门，我就做了一个！<br/>但是忘记怎么加链接了。<br/>as2里面增加链接好像就是给按钮 增加一个很短的代码就可以了，但是在as3里面就不行，上网一搜，原来as3变了太多了，更标准了，但是也更困难了！<br/><br/>下面是as2的链接方法：<br/><p class="code"><code>&lt;br/&gt;&lt;br/&gt;on&nbsp;(release)&nbsp;{&lt;br/&gt;getURL("http://www.xunzou.com/","_blank");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;</code></p><br/><br/>本文地址：http://www.xunzou.com/blog/article.asp?id=594<br/><br/>下面是as3的链接方法：<br/>要先增加一个按钮元件<br/>然后，将实例名称比如命名为：url_button；<br/>然后再行为代码里写下如下代码：<br/><p class="code"><code>&lt;br/&gt;&lt;br/&gt;function&nbsp;GoToURL(event:MouseEvent){&nbsp;&lt;br/&gt;&lt;br/&gt;var&nbsp;url=new&nbsp;URLRequest("http://www.xunzou.com")&nbsp;&lt;br/&gt;&lt;br/&gt;navigateToURL(url)&nbsp;&lt;br/&gt;}&nbsp;&lt;br/&gt;url_button.addEventListener(MouseEvent.MOUSE_DOWN,GoToURL)&lt;br/&gt;&lt;br/&gt;</code></p><br/><br/>还有一个在网上找的一个方法：在hmtl代码里面给flash增加链接。<br/><p class="code"><code>&lt;br/&gt;&lt;br/&gt;&lt;button&nbsp;style="width:Flash宽度;height:Flash高度;background:transparent;border:o;&nbsp;padding:0;cursor:hand"&nbsp;onclick="window.location.href='http://www.xunzou.com'"&gt;&nbsp;&lt;br/&gt;&lt;object&nbsp;classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&nbsp;codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"&nbsp;width="180"&nbsp;height="163"&gt;&nbsp;&lt;br/&gt;&lt;param&nbsp;name="movie"&nbsp;value="Flash地址"&gt;&nbsp;&lt;br/&gt;&lt;param&nbsp;name="quality"&nbsp;value="high"&gt;&nbsp;&lt;br/&gt;&lt;param&nbsp;name="wmode"&nbsp;value="transparent"&gt;&nbsp;&lt;br/&gt;&lt;embed&nbsp;src="Flash地址"&nbsp;width="180"&nbsp;height="163"&nbsp;quality="high"&nbsp;pluginspage="http://www.macromedia.com/go/getflashplayer"&nbsp;type="application/x-shockwave-flash"&nbsp;wmode="transparent"&gt;&lt;/embed&gt;&nbsp;&lt;br/&gt;&lt;/object&gt;&lt;/button&gt;&nbsp;&lt;br/&gt;&lt;br/&gt;</code></p><br/><br/>网上还有一种方法更牛，呵呵：<br/>首先,我们肯定是要先插入FLASH.因为,Flash默认是最高层.所以, <br/>我经常会遇见Flash把下拉菜单挡住的情况. <br/>把Flash文件放到一个层中,设为最底层,FLASH设为透明. <br/><div style="z-index:-1"> <!--1.设置FLASH为底层--> <br/><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="200" height="115"> <br/><param name="movie" value="media.swf"> <br/><param name="quality" value="high"> <br/><embed src="media.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="200" height="115"></embed> <br/><param name="wmode" value="transparent"> <!--2.必须把FLASH设置为透明--> <br/></object> </div> <br/><br/>再接下来,就是在FLASH的层上再加上一层, <br/>Flash本身不能直接加入onclick.等事件,所以,只能借助别的东西啦. <br/>就是在FLASH上加个透明层, <br/><div id="huiLayer" style="cursor: hand; position:absolute; left:10px; top:10px; width:200px; height:115px; z-index:1; visibility: visible;"><a href="http://www.cnlk.com"> <br/><img src="kong.gif" width="200" height="115" border="0"></a></div> <br/>论坛上面,给了一些解决方法,就是加个透明的层,但是,如果光有个透明层, <br/>还是不能接受事件的. 更确切地说,是一部分可以,一部分不可以,和FLASH部分重叠的那一部分不行. <br/>为什么不行.说实话,我也不清楚,我是试验得出来的... <br/><br/>当我把这个层的背景颜色设为任意一种时,不是透明时,发现.可以接受事件了,在层上加了个 <br/>超连接,也可以.. 但是,这还不是我们要的结果.因为,把整个"精美"的FLASH给遮盖了.. <br/>所以,有<img src="kong.gif" width="200" height="115" border="0"> <br/>我用PhotoShop做了个透明的图片kong.gif 大小都可以,但是必须是透明的!这样 <br/>才不至于把底下的FLASH给遮盖住了. <br/>试验了一下... 成功了... 点击FLASH.其实是击中了FLASH上层的透明图片kong.gif <br/>图片,就可以接受很多事件啦,onclick , onmouseover ,onmosueout ...... <br/>给图片加个<a></a>超连接是再简单不过的事啦.. <br/>这时,以上的问题是不是都解决了,把事件都给kong.gif接受! <br/>单击事件, <div onclick="ok()" id="huiLayer" ...........]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/547.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=547</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=547&amp;key=771f263c</trackback:ping></item><item><title>悟透JavaScript</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/460.html</link><pubDate>Mon, 06 Oct 2008 09:47:20 +0800</pubDate><guid>http://www.xunzou.com/blog/post/460.html</guid><description><![CDATA[一位高人写的文章，能和佛教参到一起，真是神了！<br/>http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html<br/><br/><b>引子</b><br/><br/>    编程世界里只存在两种基本元素，一个是数据，一个是代码。编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力。<br/><br/>    数据天生就是文静的，总想保持自己固有的本色；而代码却天生活泼，总想改变这个世界。<br/> <br/>   你看，数据代码间的关系与物质能量间的关系有着惊人的相似。数据也是有惯性的，如果没有代码来施加外力，她总保持自己原来的状态。而代码就象能量，他存在的唯一目的，就是要努力改变数据原来的状态。在代码改变数据的同时，也会因为数据的抗拒而反过来影响或改变代码原有的趋势。甚至在某些情况下，数据可以转变为代码，而代码却又有可能被转变为数据，或许还存在一个类似E=MC2形式的数码转换方程呢。然而，就是在数据和代码间这种即矛盾又统一的运转中，总能体现出计算机世界的规律，这些规律正是我们编写的程序逻辑。<br/><br/>    不过，由于不同程序员有着不同的世界观，这些数据和代码看起来也就不尽相同。于是，不同世界观的程序员们运用各自的方法论，推动着编程世界的进化和发展。<br/> <br/>    众所周知，当今最流行的编程思想莫过于面向对象编程的思想。为什么面向对象的思想能迅速风靡编程世界呢？因为面向对象的思想首次把数据和代码结合成统一体，并以一个简单的对象概念呈现给编程者。这一下子就将原来那些杂乱的算法与子程序，以及纠缠不清的复杂数据结构，划分成清晰而有序的对象结构，从而理清了数据与代码在我们心中那团乱麻般的结。我们又可以有一个更清晰的思维，在另一个思想高度上去探索更加浩瀚的编程世界了。<br/><br/>    在五祖弘忍讲授完《对象真经》之后的一天，他对众弟子们说：“经已讲完，想必尔等应该有所感悟，请各自写个偈子来看”。大弟子神秀是被大家公认为悟性最高的师兄，他的偈子写道：“身是对象树，心如类般明。朝朝勤拂拭，莫让惹尘埃！”。此偈一出，立即引起师兄弟们的轰动，大家都说写得太好了。只有火头僧慧能看后，轻轻地叹了口气，又随手在墙上写道：“对象本无根，类型亦无形。本来无一物，何处惹尘埃？”。然后摇了摇头，扬长而去。大家看了慧能的偈子都说：“写的什么乱七八糟的啊，看不懂”。师父弘忍看了神秀的诗偈也点头称赞，再看慧能的诗偈之后默然摇头。就在当天夜里，弘忍却悄悄把慧能叫到自己的禅房，将珍藏多年的软件真经传授于他，然后让他趁着月色连夜逃走...<br/><br/>    后来，慧能果然不负师父厚望，在南方开创了禅宗另一个广阔的天空。而慧能当年带走的软件真经中就有一本是《JavaScript真经》！<br/><br/><b>回归简单</b><br/><br/>    要理解JavaScript，你得首先放下对象和类的概念，回到数据和代码的本原。前面说过，编程世界只有数据和代码两种基本元素，而这两种元素又有着纠缠不清的关系。JavaScript就是把数据和代码都简化到最原始的程度。<br/><br/>    JavaScript中的数据很简洁的。简单数据只有 undefined, null, boolean, number和string这五种，而复杂数据只有一种，即object。这就好比中国古典的朴素唯物思想，把世界最基本的元素归为金木水火土，其他复杂的物质都是由这五种基本元素组成。<br/><br/>    JavaScript中的代码只体现为一种形式，就是function。<br/><br/>    注意：以上单词都是小写的，不要和Number, String, Object, Function等JavaScript内置函数混淆了。要知道，JavaScript语言是区分大小写的呀!<br/><br/>    任何一个JavaScript的标识、常量、变量和参数都只是unfined, null, bool, number, string, object 和 function类型中的一种，也就typeof返回值表明的类型。除此之外没有其他类型了。<br/><br/>    先说说简单数据类型吧。<br/><br/>    undefined:   代表一切未知的事物，啥都没有，无法想象，代码也就更无法去处理了。<br/>                      注意：typeof(undefined) 返回也是 undefined。<br/>                              可以将undefined赋值给任何变量或属性，但并不意味了清除了该变量，反而会因此多了一个属性。<br/><br/>    null:            有那么一个概念，但没有东西。无中似有，有中还无。虽难以想象，但已经可以用代码来处理了。<br/>                      注意：typeof(null)返回object，但null并非object，具有null值的变量也并非object。<br/><br/>    boolean:      是就是，非就非，没有疑义。对就对，错就错，绝对明确。既能被代码处理，也可以控制代码的流程。<br/><br/>    number:      线性的事物，大小和次序分明，多而不乱。便于代码进行批量处理，也控制代码的迭代和循环等。<br/>                      注意：typeof(NaN)和typeof(Infinity)都返回number 。<br/>                              NaN参与任何数值计算的结构都是NaN，而且 NaN != NaN 。<br/>                              Infinity / Infinity = NaN 。<br/><br/>    string:         面向人类的理性事物，而不是机器信号。人机信息沟通，代码据此理解人的意图等等，都靠它了。<br/><br/>     简单类型都不是对象，JavaScript没有将对象化的能力赋予这些简单类型。直接被赋予简单类型常量值的标识符、变量和参数都不是一个对象。<br/><br/>    所谓“对象化”，就是可以将数据和代码组织成复杂结构的能力。JavaScript中只有object类型和function类型提供了对象化的能力。<br/><br/><b>没有类</b><br/><br/>    object就是对象的类型。在JavaScript中不管多么复杂的数据和代码，都可以组织成object形式的对象。<br/><br/>    但JavaScript却没有 “类”的概念！<br/><br/>    对于许多面向对象的程序员来说，这恐怕是JavaScript中最难以理解的地方。是啊，几乎任何讲面向对象的书中，第一个要讲的就是“类”的概念，这可是面向对象的支柱。这突然没有了“类”，我们就象一下子没了精神支柱，感到六神无主。看来，要放下对象和类，达到“对象本无根，类型亦无形”的境界确实是件不容易的事情啊。<br/><br/>    这样，我们先来看一段JavaScript程序：<br/><p class="code"><code>&nbsp;var&nbsp;life&nbsp;=&nbsp;{};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;for(life.age&nbsp;=&nbsp;1;&nbsp;life.age&nbsp;&lt;=&nbsp;3;&nbsp;life.age++)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(life.age)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:&nbsp;life.body&nbsp;=&nbsp;"卵细胞";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.say&nbsp;=&nbsp;function(){alert(this.age+this.body)};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:&nbsp;life.tail&nbsp;=&nbsp;"尾巴";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.gill&nbsp;=&nbsp;"腮";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.body&nbsp;=&nbsp;"蝌蚪";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.say&nbsp;=&nbsp;function(){alert(this.age+this.body+"-"+this.tail+","+this.gill)};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3:&nbsp;delete&nbsp;life.tail;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;life.gill;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.legs&nbsp;=&nbsp;"四条腿";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.lung&nbsp;=&nbsp;"肺";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.body&nbsp;=&nbsp;"青蛙";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.say&nbsp;=&nbsp;function(){alert(this.age+this.body+"-"+this.legs+","+this.lung)};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.say();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};</code></p><br/><br/>    这段JavaScript程序一开始产生了一个生命对象life，life诞生时只是一个光溜溜的对象，没有任何属性和方法。在第一次生命过程中，它有了一个身体属性body，并有了一个say方法，看起来是一个“卵细胞”。在第二次生命过程中，它又长出了“尾巴”和“腮”，有了tail和gill属性，显然它是一个“蝌蚪”。在第三次生命过程中，它的tail和gill属性消失了，但又长出了“四条腿”和“肺”，有了legs和lung属性，从而最终变成了“青蛙”。如果，你的想像力丰富的话，或许还能让它变成英俊的“王子”，娶个美丽的“公主”什么的。不过，在看完这段程序之后，请你思考一个问题：<br/><br/>    我们一定需要类吗？<br/><br/>    还记得儿时那个“小蝌蚪找妈妈”的童话吗？也许就在昨天晚，你的孩子刚好是在这个美丽的童话中进入梦乡的吧。可爱的小蝌蚪也就是在其自身类型不断演化过程中，逐渐变成了和妈妈一样的“类”，从而找到了自己的妈妈。这个童话故事中蕴含的编程哲理就是：对象的“类”是从无到有，又不断演化，最终又消失于无形之中的...<br/><br/>    “类”，的确可以帮助我们理解复杂的现实世界，这纷乱的现实世界也的确需要进行分类。但如果我们的思想被“类”束缚住了，“类”也就变成了“累”。想象一下，如果一个生命对象开始的时就被规定了固定的“类”，那么它还能演化吗？蝌蚪还能变成青蛙吗？还可以给孩子们讲小蝌蚪找妈妈的故事吗？<br/><br/>    所以，JavaScript中没有“类”，类已化于无形，与对象融为一体。正是由于放下了“类”这个概念，JavaScript的对象才有了其他编程语言所没有的活力。<br/><br/>    如果，此时你的内心深处开始有所感悟，那么你已经逐渐开始理解JavaScript的禅机了。<br/><br/><b>函数的魔力</b><br/><br/>   接下来，我们再讨论一下JavaScript函数的魔力吧。<br/><br/>    JavaScript的代码就只有function一种形式，function就是函数的类型。也许其他编程语言还有procedure或 method等代码概念，但在JavaScript里只有function一种形式。当我们写下一个函数的时候，只不过是建立了一个function类型的实体而已。请看下面的程序：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;function&nbsp;myfunc()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("hello");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(typeof(myfunc));</code></p><br/><br/> 这个代码运行之后可以看到typeof(myfunc)返回的是function。以上的函数写法我们称之为“定义式”的，如果我们将其改写成下面的“变量式”的，就更容易理解了：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;myfunc&nbsp;=&nbsp;function&nbsp;()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("hello");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(typeof(myfunc));</code></p><br/>   这里明确定义了一个变量myfunc，它的初始值被赋予了一个function的实体。因此，typeof(myfunc)返回的也是function。其实，这两种函数的写法是等价的，除了一点细微差别，其内部实现完全相同。也就是说，我们写的这些JavaScript函数只是一个命了名的变量而已，其变量类型即为function，变量的值就是我们编写的函数代码体。<br/><br/>    聪明的你或许立即会进一步的追问：既然函数只是变量，那么变量就可以被随意赋值并用到任意地方啰？<br/><br/>    我们来看看下面的代码：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;myfunc&nbsp;=&nbsp;function&nbsp;()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("hello");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;//第一次调用myfunc，输出hello&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;myfunc&nbsp;=&nbsp;function&nbsp;()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("yeah");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;//第二次调用myfunc，将输出yeah</code></p><br/><br/>   这个程序运行的结果告诉我们：答案是肯定的！在第一次调用函数之后，函数变量又被赋予了新的函数代码体，使得第二次调用该函数时，出现了不同的输出。<br/><br/>    好了，我们又来把上面的代码改成第一种定义式的函数形式：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;myfunc&nbsp;()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("hello");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;//这里调用myfunc，输出yeah而不是hello&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;myfunc&nbsp;()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("yeah");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;//这里调用myfunc，当然输出yeah</code></p><br/>    按理说，两个签名完全相同的函数，在其他编程语言中应该是非法的。但在JavaScript中，这没错。不过，程序运行之后却发现一个奇怪的现象：两次调用都只是最后那个函数里输出的值！显然第一个函数没有起到任何作用。这又是为什么呢？<br/><br/>    原来，JavaScript执行引擎并非一行一行地分析和执行程序，而是一段一段地分析执行的。而且，在同一段程序的分析执行中，定义式的函数语句会被提取出来优先执行。函数定义执行完之后，才会按顺序执行其他语句代码。也就是说，在第一次调用myfunc之前，第一个函数语句定义的代码逻辑，已被第二个函数定义语句覆盖了。所以，两次都调用都是执行最后一个函数逻辑了。<br/><br/>    如果把这个JavaScript代码分成两段，例如将它们写在一个html中，并用<script/>标签将其分成这样的两块：<br/><p class="code"><code>&lt;script&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;myfunc&nbsp;()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("hello");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;//这里调用myfunc，输出hello&lt;br/&gt;&lt;/script&gt;&lt;br/&gt;&lt;br/&gt;&lt;script&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;myfunc&nbsp;()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("yeah");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;//这里调用myfunc，输出yeah&lt;br/&gt;&lt;/script&gt;</code></p><br/>    这时，输出才是各自按顺序来的，也证明了JavaScript的确是一段段地执行的。<br/><br/>    一段代码中的定义式函数语句会优先执行，这似乎有点象静态语言的编译概念。所以，这一特征也被有些人称为：JavaScript的“预编译”。<br/><br/>    大多数情况下，我们也没有必要去纠缠这些细节问题。只要你记住一点：JavaScript里的代码也是一种数据，同样可以被任意赋值和修改的，而它的值就是代码的逻辑。只是，与一般数据不同的是，函数是可以被调用执行的。<br/><br/>    不过，如果JavaScript函数仅仅只有这点道行的话，这与C++的函数指针，DELPHI的方法指针，C#的委托相比，又有啥稀奇嘛！然而，JavaScript函数的神奇之处还体现在另外两个方面：一是函数function类型本身也具有对象化的能力，二是函数function与对象 object超然的结合能力。<br/><br/><b>奇妙的对象</b><br/><br/>   先来说说函数的对象化能力。<br/><br/>    任何一个函数都可以为其动态地添加或去除属性，这些属性可以是简单类型，可以是对象，也可以是其他函数。也就是说，函数具有对象的全部特征，你完全可以把函数当对象来用。其实，函数就是对象，只不过比一般的对象多了一个括号“()”操作符，这个操作符用来执行函数的逻辑。即，函数本身还可以被调用，一般对象却不可以被调用，除此之外完全相同。请看下面的代码：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Sing()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with(arguments.callee)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(author&nbsp;+&nbsp;"："&nbsp;+&nbsp;poem);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Sing.author&nbsp;=&nbsp;"李白";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Sing.poem&nbsp;=&nbsp;"汉家秦地月，流影照明妃。一上玉关道，天涯去不归";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Sing();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Sing.author&nbsp;=&nbsp;"李战";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Sing.poem&nbsp;=&nbsp;"日出汉家天，月落阴山前。女儿琵琶怨，已唱三千年";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Sing();</code></p><br/>    在这段代码中，Sing函数被定义后，又给Sing函数动态地增加了author和poem属性。将author和poem属性设为不同的作者和诗句，在调用Sing()时就能显示出不同的结果。这个示例用一种诗情画意的方式，让我们理解了JavaScript函数就是对象的本质，也感受到了JavaScript语言的优美。<br/><br/>    好了，以上的讲述，我们应该算理解了function类型的东西都是和object类型一样的东西，这种东西被我们称为“对象”。我们的确可以这样去看待这些“对象”，因为它们既有“属性”也有“方法”嘛。但下面的代码又会让我们产生新的疑惑：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;var&nbsp;anObject&nbsp;=&nbsp;{};&nbsp;&nbsp;//一个对象&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;anObject.aProperty&nbsp;=&nbsp;"Property&nbsp;of&nbsp;object";&nbsp;&nbsp;//对象的一个属性&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;anObject.aMethod&nbsp;=&nbsp;function(){alert("Method&nbsp;of&nbsp;object")};&nbsp;//对象的一个方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;//主要看下面：&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(anObject["aProperty"]);&nbsp;&nbsp;&nbsp;//可以将对象当数组以属性名作为下标来访问属性&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;anObject["aMethod"]();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//可以将对象当数组以方法名作为下标来调用方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;var&nbsp;s&nbsp;in&nbsp;anObject)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//遍历对象的所有属性和方法进行迭代化处理&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(s&nbsp;+&nbsp;"&nbsp;is&nbsp;a&nbsp;"&nbsp;+&nbsp;typeof(anObject[s]));</code></p><br/>   同样对于function类型的对象也是一样：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;aFunction&nbsp;=&nbsp;function()&nbsp;{};&nbsp;&nbsp;//一个函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;aFunction.aProperty&nbsp;=&nbsp;"Property&nbsp;of&nbsp;function";&nbsp;&nbsp;//函数的一个属性&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;aFunction.aMethod&nbsp;=&nbsp;function(){alert("Method&nbsp;of&nbsp;function")};&nbsp;//函数的一个方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;//主要看下面：&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(aFunction["aProperty"]);&nbsp;&nbsp;&nbsp;//可以将函数当数组以属性名作为下标来访问属性&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;aFunction["aMethod"]();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//可以将函数当数组以方法名作为下标来调用方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;var&nbsp;s&nbsp;in&nbsp;aFunction)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//遍历函数的所有属性和方法进行迭代化处理&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(s&nbsp;+&nbsp;"&nbsp;is&nbsp;a&nbsp;"&nbsp;+&nbsp;typeof(aFunction[s]));</code></p><br/>    是的，对象和函数可以象数组一样，用属性名或方法名作为下标来访问并处理。那么，它到底应该算是数组呢，还是算对象？<br/><br/>    我们知道，数组应该算是线性数据结构，线性数据结构一般有一定的规律，适合进行统一的批量迭代操作等，有点像波。而对象是离散数据结构，适合描述分散的和个性化的东西，有点像粒子。因此，我们也可以这样问：JavaScript里的对象到底是波还是粒子？<br/><br/>    如果存在对象量子论，那么答案一定是：波粒二象性！<br/><br/><b>放下对象</b><br/><br/>   我们再来看看function与object的超然结合吧。<br/><br/>    在面向对象的编程世界里，数据与代码的有机结合就构成了对象的概念。自从有了对象，编程世界就被划分成两部分，一个是对象内的世界，一个是对象外的世界。对象天生具有自私的一面，外面的世界未经允许是不可访问对象内部的。对象也有大方的一面，它对外提供属性和方法，也为他人服务。不过，在这里我们要谈到一个有趣的问题，就是“对象的自我意识”。<br/><br/>    什么？没听错吧？对象有自我意识？<br/><br/>    可能对许多程序员来说，这的确是第一次听说。不过，请君看看C++、C#和Java的this，DELPHI的self，还有VB的me，或许你会恍然大悟！当然，也可能只是说句“不过如此”而已。<br/><br/>    然而，就在对象将世界划分为内外两部分的同时，对象的“自我”也就随之产生。“自我意识”是生命的最基本特征！正是由于对象这种强大的生命力，才使得编程世界充满无限的生机和活力。<br/><br/>    但对象的“自我意识”在带给我们快乐的同时也带来了痛苦和烦恼。我们给对象赋予了太多欲望，总希望它们能做更多的事情。然而，对象的自私使得它们互相争抢系统资源，对象的自负让对象变得复杂和臃肿，对象的自欺也往往带来挥之不去的错误和异常。我们为什么会有这么多的痛苦和烦恼呢？<br/> <br/>    为此，有一个人，在对象树下，整整想了九九八十一天，终于悟出了生命的痛苦来自于欲望，但究其欲望的根源是来自于自我意识。于是他放下了“自我”，在对象树下成了佛，从此他开始普度众生，传播真经。他的名字就叫释迦摩尼，而《JavaScript真经》正是他所传经书中的一本。<br/><br/>    JavaScript中也有this，但这个this却与C++、C#或Java等语言的this不同。一般编程语言的this就是对象自己，而 JavaScript的this却并不一定！this可能是我，也可能是你，可能是他，反正是我中有你，你中有我，这就不能用原来的那个“自我”来理解 JavaScript这个this的含义了。为此，我们必须首先放下原来对象的那个“自我”。<br/><br/>    我们来看下面的代码：<br/><p class="code"><code>&nbsp;function&nbsp;WhoAmI()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个函数WhoAmI&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("I'm&nbsp;"&nbsp;+&nbsp;this.name&nbsp;+&nbsp;"&nbsp;of&nbsp;"&nbsp;+&nbsp;typeof(this));&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI();&nbsp;&nbsp;&nbsp;//此时是this当前这段代码的全局对象，在浏览器中就是window对象，其name属性为空字符串。输出：I'm&nbsp;of&nbsp;object&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;{name:&nbsp;"Bill&nbsp;Gates"};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.WhoAmI&nbsp;=&nbsp;WhoAmI;&nbsp;&nbsp;//将函数WhoAmI作为BillGates的方法。&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.WhoAmI();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此时的this是BillGates。输出：I'm&nbsp;Bill&nbsp;Gates&nbsp;of&nbsp;object&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;{name:&nbsp;"Steve&nbsp;Jobs"};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.WhoAmI&nbsp;=&nbsp;WhoAmI;&nbsp;&nbsp;//将函数WhoAmI作为SteveJobs的方法。&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.WhoAmI();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此时的this是SteveJobs。输出：I'm&nbsp;Steve&nbsp;Jobs&nbsp;of&nbsp;object&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.call(BillGates);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//直接将BillGates作为this，调用WhoAmI。输出：I'm&nbsp;Bill&nbsp;Gates&nbsp;of&nbsp;object&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.call(SteveJobs);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//直接将SteveJobs作为this，调用WhoAmI。输出：I'm&nbsp;Steve&nbsp;Jobs&nbsp;of&nbsp;object&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.WhoAmI.call(SteveJobs);&nbsp;&nbsp;&nbsp;//将SteveJobs作为this，却调用BillGates的WhoAmI方法。输出：I'm&nbsp;Steve&nbsp;Jobs&nbsp;of&nbsp;object&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.WhoAmI.call(BillGates);&nbsp;&nbsp;&nbsp;//将BillGates作为this，却调用SteveJobs的WhoAmI方法。输出：I'm&nbsp;Bill&nbsp;Gates&nbsp;of&nbsp;object&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.WhoAmI&nbsp;=&nbsp;WhoAmI;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将WhoAmI函数设置为自身的方法。&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.name&nbsp;=&nbsp;"WhoAmI";&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.WhoAmI();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此时的this是WhoAmI函数自己。输出：I'm&nbsp;WhoAmI&nbsp;of&nbsp;function&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;({name:&nbsp;"nobody",&nbsp;WhoAmI:&nbsp;WhoAmI}).WhoAmI();&nbsp;&nbsp;&nbsp;&nbsp;//临时创建一个匿名对象并设置属性后调用WhoAmI方法。输出：I'm&nbsp;nobody&nbsp;of&nbsp;object</code></p><br/><br/>    从上面的代码可以看出，同一个函数可以从不同的角度来调用，this并不一定是函数本身所属的对象。this只是在任意对象和function元素结合时的一个概念，是种结合比起一般对象语言的默认结合更加灵活，显得更加超然和洒脱。<br/><br/>    在JavaScript函数中，你只能把this看成当前要服务的“这个”对象。this是一个特殊的内置参数，根据this参数，您可以访问到“这个”对象的属性和方法，但却不能给this参数赋值。在一般对象语言中，方法体代码中的this可以省略的，成员默认都首先是“自己”的。但JavaScript却不同，由于不存在“自我”，当访问“这个”对象时，this不可省略！<br/><br/>    JavaScript提供了传递this参数的多种形式和手段，其中，象BillGates.WhoAmI()和SteveJobs.WhoAmI()这种形式，是传递this参数最正规的形式，此时的this就是函数所属的对象本身。而大多数情况下，我们也几乎很少去采用那些借花仙佛的调用形式。但只我们要明白JavaScript的这个“自我”与其他编程语言的“自我”是不同的，这是一个放下了的“自我”，这就是JavaScript特有的世界观。<br/><br/><b>对象素描</b><br/>    已经说了许多了许多话题了，但有一个很基本的问题我们忘了讨论，那就是：怎样建立对象？<br/><br/>    在前面的示例中，我们已经涉及到了对象的建立了。我们使用了一种被称为JavaScript Object Notation(缩写JSON)的形式，翻译为中文就是“JavaScript对象表示法”。<br/><br/>    JSON为创建对象提供了非常简单的方法。例如，<br/>    创建一个没有任何属性的对象：<br/><p class="code"><code>var&nbsp;o&nbsp;=&nbsp;{};</code></p><br/>    创建一个对象并设置属性及初始值：<br/><p class="code"><code>var&nbsp;person&nbsp;=&nbsp;{name:&nbsp;"Angel",&nbsp;age:&nbsp;18,&nbsp;married:&nbsp;false};</code></p><br/>    创建一个对象并设置属性和方法：<br/><p class="code"><code>var&nbsp;speaker&nbsp;=&nbsp;{text:&nbsp;"Hello&nbsp;World",&nbsp;say:&nbsp;function(){alert(this.text)}};</code></p><br/>     创建一个更复杂的对象，嵌套其他对象和对象数组等：<br/>   <p class="code"><code>&nbsp;var&nbsp;company&nbsp;=&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;"Microsoft",&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product:&nbsp;"softwares",&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chairman:&nbsp;{name:&nbsp;"Bill&nbsp;Gates",&nbsp;age:&nbsp;53,&nbsp;Married:&nbsp;true},&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;employees:&nbsp;[{name:&nbsp;"Angel",&nbsp;age:&nbsp;26,&nbsp;Married:&nbsp;false},&nbsp;{name:&nbsp;"Hanson",&nbsp;age:&nbsp;32,&nbsp;Marred:&nbsp;true}],&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readme:&nbsp;function()&nbsp;{document.write(this.name&nbsp;+&nbsp;"&nbsp;product&nbsp;"&nbsp;+&nbsp;this.product);}&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};</code></p><br/>    JSON的形式就是用大括“{}”号包括起来的项目列表，每一个项目间并用逗号“,”分隔，而项目就是用冒号“:”分隔的属性名和属性值。这是典型的字典表示形式，也再次表明了 JavaScript里的对象就是字典结构。不管多么复杂的对象，都可以被一句JSON代码来创建并赋值。<br/><br/>    其实，JSON就是JavaScript对象最好的序列化形式，它比XML更简洁也更省空间。对象可以作为一个JSON形式的字符串，在网络间自由传递和交换信息。而当需要将这个JSON字符串变成一个JavaScript对象时，只需要使用eval函数这个强大的数码转换引擎，就立即能得到一个JavaScript内存对象。正是由于JSON的这种简单朴素的天生丽质，才使得她在AJAX舞台上成为璀璨夺目的明星。<br/><br/>    JavaScript就是这样，把面向对象那些看似复杂的东西，用及其简洁的形式表达出来。卸下对象浮华的浓妆，还对象一个眉目清晰！<br/><br/><b>构造对象</b><br/><br/>    好了，接下我们来讨论一下对象的另一种创建方法。<br/><br/>    除JSON外，在JavaScript中我们可以使用new操作符结合一个函数的形式来创建对象。例如：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;MyFunc()&nbsp;{};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个空函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;anObj&nbsp;=&nbsp;new&nbsp;MyFunc();&nbsp;&nbsp;//使用new操作符，借助MyFun函数，就创建了一个对象</code></p><br/>    JavaScript的这种创建对象的方式可真有意思，如何去理解这种写法呢？<br/> <br/>   其实，可以把上面的代码改写成这种等价形式：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;MyFunc(){};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;anObj&nbsp;=&nbsp;{};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建一个对象&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;MyFunc.call(anObj);&nbsp;//将anObj对象作为this指针调用MyFunc函数</code></p><br/>    我们就可以这样理解，JavaScript先用new操作符创建了一个对象，紧接着就将这个对象作为this参数调用了后面的函数。其实，JavaScript内部就是这么做的，而且任何函数都可以被这样调用！但从 “anObj = new MyFunc()” 这种形式，我们又看到一个熟悉的身影，C++和C#不就是这样创建对象的吗？原来，条条大路通灵山，殊途同归啊！<br/><br/>    君看到此处也许会想，我们为什么不可以把这个MyFunc当作构造函数呢？恭喜你，答对了！JavaScript也是这么想的！请看下面的代码： <br/><p class="code"><code>&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Person(name)&nbsp;&nbsp;&nbsp;//带参数的构造函数&lt;br/&gt;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&nbsp;&nbsp;&nbsp;//将参数值赋给给this对象的属性&lt;br/&gt;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.SayHello&nbsp;=&nbsp;function()&nbsp;{alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name);};&nbsp;&nbsp;&nbsp;//给this对象定义一个SayHello方法。&lt;br/&gt;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;6&nbsp;&lt;br/&gt;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Employee(name,&nbsp;salary)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//子构造函数&lt;br/&gt;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.call(this,&nbsp;name);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将this传给父构造函数&lt;br/&gt;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.salary&nbsp;=&nbsp;salary;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置一个this的salary属性&lt;br/&gt;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ShowMeTheMoney&nbsp;=&nbsp;function()&nbsp;{alert(this.name&nbsp;+&nbsp;"&nbsp;$"&nbsp;+&nbsp;this.salary);};&nbsp;&nbsp;//添加ShowMeTheMoney方法。&lt;br/&gt;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;Person("Bill&nbsp;Gates");&nbsp;&nbsp;&nbsp;//用Person构造函数创建BillGates对象&lt;br/&gt;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;new&nbsp;Employee("Steve&nbsp;Jobs",&nbsp;1234);&nbsp;&nbsp;&nbsp;//用Empolyee构造函数创建SteveJobs对象&lt;br/&gt;16&nbsp;&lt;br/&gt;17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;//显示：I'm&nbsp;Bill&nbsp;Gates&lt;br/&gt;18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;//显示：I'm&nbsp;Steve&nbsp;Jobs&lt;br/&gt;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.ShowMeTheMoney();&nbsp;&nbsp;&nbsp;//显示：Steve&nbsp;Jobs&nbsp;$1234&lt;br/&gt;20&nbsp;&lt;br/&gt;21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.constructor&nbsp;==&nbsp;Person);&nbsp;&nbsp;//显示：true&lt;br/&gt;22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(SteveJobs.constructor&nbsp;==&nbsp;Employee);&nbsp;&nbsp;//显示：true&lt;br/&gt;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello&nbsp;==&nbsp;SteveJobs.SayHello);&nbsp;//显示：false</code></p><br/>    这段代码表明，函数不但可以当作构造函数，而且还可以带参数，还可以为对象添加成员和方法。其中的第9行，Employee构造函数又将自己接收的this作为参数调用Person构造函数，这就是相当于调用基类的构造函数。第21、22行还表明这样一个意思：BillGates是由Person构造的，而SteveJobs是由Employee构造的。对象内置的constructor属性还指明了构造对象所用的具体函数！<br/><br/>    其实，如果你愿意把函数当作“类”的话，她就是“类”，因为她本来就有“类”的那些特征。难道不是吗？她生出的儿子各个都有相同的特征，而且构造函数也与类同名嘛！<br/><br/>    但要注意的是，用构造函数操作this对象创建出来的每一个对象，不但具有各自的成员数据，而且还具有各自的方法数据。换句话说，方法的代码体(体现函数逻辑的数据)在每一个对象中都存在一个副本。尽管每一个代码副本的逻辑是相同的，但对象们确实是各自保存了一份代码体。上例中的最后一句说明了这一实事，这也解释了JavaScript中的函数就是对象的概念。<br/><br/>    同一类的对象各自有一份方法代码显然是一种浪费。在传统的对象语言中，方法函数并不象JavaScript那样是个对象概念。即使也有象函数指针、方法指针或委托那样的变化形式，但其实质也是对同一份代码的引用。一般的对象语言很难遇到这种情况。<br/><br/>    不过，JavaScript语言有大的灵活性。我们可以先定义一份唯一的方法函数体，并在构造this对象时使用这唯一的函数对象作为其方法，就能共享方法逻辑。例如：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;SayHello()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//先定义一份SayHello函数代码&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Person(name)&nbsp;&nbsp;&nbsp;//带参数的构造函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&nbsp;&nbsp;&nbsp;//将参数值赋给给this对象的属性&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.SayHello&nbsp;=&nbsp;SayHello;&nbsp;&nbsp;&nbsp;//给this对象SayHello方法赋值为前面那份SayHello代码。&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;Person("Bill&nbsp;Gates");&nbsp;&nbsp;&nbsp;//创建BillGates对象&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;new&nbsp;Person("Steve&nbsp;Jobs");&nbsp;&nbsp;&nbsp;//创建SteveJobs对象&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello&nbsp;==&nbsp;SteveJobs.SayHello);&nbsp;//显示：true</code></p><br/>    其中，最后一行的输出结果表明两个对象确实共享了一个函数对象。虽然，这段程序达到了共享了一份方法代码的目的，但却不怎么优雅。因为，定义SayHello方法时反映不出其与Person类的关系。“优雅”这个词用来形容代码，也不知道是谁先提出来的。不过，这个词反映了程序员已经从追求代码的正确、高效、可靠和易读等基础上，向着追求代码的美观感觉和艺术境界的层次发展，程序人生又多了些浪漫色彩。<br/><br/>   显然，JavaScript早想到了这一问题，她的设计者们为此提供了一个有趣的prototype概念。<br/><br/><b>初看原型</b><br/><br/>    prototype源自法语，软件界的标准翻译为“原型”，代表事物的初始形态，也含有模型和样板的意义。JavaScript中的prototype概念恰如其分地反映了这个词的内含，我们不能将其理解为C++的prototype那种预先声明的概念。<br/><br/>    JavaScript的所有function类型的对象都有一个prototype属性。这个prototype属性本身又是一个object类型的对象，因此我们也可以给这个prototype对象添加任意的属性和方法。既然prototype是对象的“原型”，那么由该函数构造出来的对象应该都会具有这个“原型”的特性。事实上，在构造函数的prototype上定义的所有属性和方法，都是可以通过其构造的对象直接访问和调用的。也可以这么说，prototype提供了一群同类对象共享属性和方法的机制。<br/><br/>    我们先来看看下面的代码：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Person(name)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&nbsp;&nbsp;&nbsp;//设置对象属性，每个对象各自一份属性数据&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;=&nbsp;function()&nbsp;&nbsp;//给Person函数的prototype添加SayHello方法。&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;Person("Bill&nbsp;Gates");&nbsp;&nbsp;&nbsp;//创建BillGates对象&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;new&nbsp;Person("Steve&nbsp;Jobs");&nbsp;&nbsp;&nbsp;//创建SteveJobs对象&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;//通过BillGates对象直接调用到SayHello方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;//通过SteveJobs对象直接调用到SayHello方法&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello&nbsp;==&nbsp;SteveJobs.SayHello);&nbsp;//因为两个对象是共享prototype的SayHello，所以显示：true</code></p><br/>    程序运行的结果表明，构造函数的prototype上定义的方法确实可以通过对象直接调用到，而且代码是共享的。显然，把方法设置到prototype的写法显得优雅多了，尽管调用形式没有变，但逻辑上却体现了方法与类的关系，相对前面的写法，更容易理解和组织代码。<br/><br/>    那么，对于多层次类型的构造函数情况又如何呢？<br/><br/>    我们再来看下面的代码：<br/><p class="code"><code>&lt;br/&gt;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Person(name)&nbsp;&nbsp;&nbsp;//基类构造函数&lt;br/&gt;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&lt;br/&gt;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;=&nbsp;function()&nbsp;&nbsp;//给基类构造函数的prototype添加方法&lt;br/&gt;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name);&lt;br/&gt;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Employee(name,&nbsp;salary)&nbsp;//子类构造函数&lt;br/&gt;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.call(this,&nbsp;name);&nbsp;&nbsp;&nbsp;&nbsp;//调用基类构造函数&lt;br/&gt;14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.salary&nbsp;=&nbsp;salary;&lt;br/&gt;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Employee.prototype&nbsp;=&nbsp;new&nbsp;Person();&nbsp;&nbsp;//建一个基类的对象作为子类原型的原型，这里很有意思&lt;br/&gt;18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Employee.prototype.ShowMeTheMoney&nbsp;=&nbsp;function()&nbsp;&nbsp;//给子类添构造函数的prototype添加方法&lt;br/&gt;20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name&nbsp;+&nbsp;"&nbsp;$"&nbsp;+&nbsp;this.salary);&lt;br/&gt;22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;23&nbsp;&lt;br/&gt;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;Person("Bill&nbsp;Gates");&nbsp;&nbsp;&nbsp;//创建基类Person的BillGates对象&lt;br/&gt;25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;new&nbsp;Employee("Steve&nbsp;Jobs",&nbsp;1234);&nbsp;&nbsp;&nbsp;//创建子类Employee的SteveJobs对象&lt;br/&gt;26&nbsp;&lt;br/&gt;27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//通过对象直接调用到prototype的方法&lt;br/&gt;28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//通过子类对象直接调用基类prototype的方法，关注！&lt;br/&gt;29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.ShowMeTheMoney();&nbsp;//通过子类对象直接调用子类prototype的方法&lt;br/&gt;30&nbsp;&lt;br/&gt;31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello&nbsp;==&nbsp;SteveJobs.SayHello);&nbsp;//显示：true，表明prototype的方法是共享的</code></p><br/><br/>   这段代码的第17行，构造了一个基类的对象，并将其设为子类构造函数的prototype，这是很有意思的。这样做的目的就是为了第28行，通过子类对象也可以直接调用基类prototype的方法。为什么可以这样呢？<br/><br/>    原来，在JavaScript中，prototype不但能让对象共享自己财富，而且prototype还有寻根问祖的天性，从而使得先辈们的遗产可以代代相传。当从一个对象那里读取属性或调用方法时，如果该对象自身不存在这样的属性或方法，就会去自己关联的prototype对象那里寻找；如果prototype没有，又会去prototype自己关联的前辈prototype那里寻找，直到找到或追溯过程结束为止。<br/><br/>    在JavaScript内部，对象的属性和方法追溯机制是通过所谓的prototype链来实现的。当用new操作符构造对象时，也会同时将构造函数的prototype对象指派给新创建的对象，成为该对象内置的原型对象。对象内置的原型对象应该是对外不可见的，尽管有些浏览器(如Firefox)可以让我们访问这个内置原型对象，但并不建议这样做。内置的原型对象本身也是对象，也有自己关联的原型对象，这样就形成了所谓的原型链。<br/><br/>    在原型链的最末端，就是Object构造函数prototype属性指向的那一个原型对象。这个原型对象是所有对象的最老祖先，这个老祖宗实现了诸如toString等所有对象天生就该具有的方法。其他内置构造函数，如Function, Boolean, String, Date和RegExp等的prototype都是从这个老祖宗传承下来的，但他们各自又定义了自身的属性和方法，从而他们的子孙就表现出各自宗族的那些特征。<br/><br/>    这不就是“继承”吗？是的，这就是“继承”，是JavaScript特有的“原型继承”。<br/><br/>    “原型继承”是慈祥而又严厉的。原形对象将自己的属性和方法无私地贡献给孩子们使用，也并不强迫孩子们必须遵从，允许一些顽皮孩子按自己的兴趣和爱好独立行事。从这点上看，原型对象是一位慈祥的母亲。然而，任何一个孩子虽然可以我行我素，但却不能动原型对象既有的财产，因为那可能会影响到其他孩子的利益。从这一点上看，原型对象又象一位严厉的父亲。我们来看看下面的代码就可以理解这个意思了：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Person(name)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.company&nbsp;=&nbsp;"Microsoft";&nbsp;//原型的属性&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;=&nbsp;function()&nbsp;&nbsp;//原型的方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name&nbsp;+&nbsp;"&nbsp;of&nbsp;"&nbsp;+&nbsp;this.company);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;Person("Bill&nbsp;Gates");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;//由于继承了原型的东西，规规矩矩输出：Hello,&nbsp;I'm&nbsp;Bill&nbsp;Gates&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;new&nbsp;Person("Steve&nbsp;Jobs");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.company&nbsp;=&nbsp;"Apple";&nbsp;&nbsp;&nbsp;&nbsp;//设置自己的company属性，掩盖了原型的company属性&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello&nbsp;=&nbsp;function()&nbsp;//实现了自己的SayHello方法，掩盖了原型的SayHello方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hi,&nbsp;"&nbsp;+&nbsp;this.name&nbsp;+&nbsp;"&nbsp;like&nbsp;"&nbsp;+&nbsp;this.company&nbsp;+&nbsp;",&nbsp;ha&nbsp;ha&nbsp;ha&nbsp;");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;//都是自己覆盖的属性和方法，输出：Hi,&nbsp;Steve&nbsp;Jobs&nbsp;like&nbsp;Apple,&nbsp;ha&nbsp;ha&nbsp;ha&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;//SteveJobs的覆盖没有影响原型对象，BillGates还是按老样子输出</code></p><br/><br/>   对象可以掩盖原型对象的那些属性和方法，一个构造函数原型对象也可以掩盖上层构造函数原型对象既有的属性和方法。这种掩盖其实只是在对象自己身上创建了新的属性和方法，只不过这些属性和方法与原型对象的那些同名而已。JavaScript就是用这简单的掩盖机制实现了对象的“多态”性，与静态对象语言的虚函数和重载(override)概念不谋而合。<br/><br/>    然而，比静态对象语言更神奇的是，我们可以随时给原型对象动态添加新的属性和方法，从而动态地扩展基类的功能特性。这在静态对象语言中是很难想象的。我们来看下面的代码：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Person(name)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;=&nbsp;function()&nbsp;&nbsp;//建立对象前定义的方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;Person("Bill&nbsp;Gates");&nbsp;&nbsp;&nbsp;//建立对象&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.Retire&nbsp;=&nbsp;function()&nbsp;&nbsp;&nbsp;&nbsp;//建立对象后再动态扩展原型的方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Poor&nbsp;"&nbsp;+&nbsp;this.name&nbsp;+&nbsp;",&nbsp;bye&nbsp;bye!");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.Retire();&nbsp;//动态扩展的方法即可被先前建立的对象立即调用</code></p><br/>    阿弥佗佛，原型继承竟然可以玩出有这样的法术！<br/><br/><b>原型扩展</b><br/><br/>    想必君的悟性极高，可能你会这样想：如果在JavaScript内置的那些如Object和Function等函数的prototype上添加些新的方法和属性，是不是就能扩展JavaScript的功能呢？<br/><br/>    那么，恭喜你，你得到了！<br/><br/>    在AJAX技术迅猛发展的今天，许多成功的AJAX项目的JavaScript运行库都大量扩展了内置函数的prototype功能。比如微软的ASP.NET AJAX，就给这些内置函数及其prototype添加了大量的新特性，从而增强了JavaScript的功能。<br/><br/>    我们来看一段摘自MicrosoftAjax.debug.js中的代码：<br/><p class="code"><code>&lt;br/&gt;String.prototype.trim&nbsp;=&nbsp;function&nbsp;String$trim()&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(arguments.length&nbsp;!==&nbsp;0)&nbsp;throw&nbsp;Error.parameterCount();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.replace(/^\s+|\s+$/g,&nbsp;'');&lt;br/&gt;}</code></p><br/>    这段代码就是给内置String函数的prototype扩展了一个trim方法，于是所有的String类对象都有了trim方法了。有了这个扩展，今后要去除字符串两段的空白，就不用再分别处理了，因为任何字符串都有了这个扩展功能，只要调用即可，真的很方便。<br/><br/>    当然，几乎很少有人去给Object的prototype添加方法，因为那会影响到所有的对象，除非在你的架构中这种方法的确是所有对象都需要的。<br/><br/>    前两年，微软在设计AJAX类库的初期，用了一种被称为“闭包”(closure)的技术来模拟“类”。其大致模型如下：<br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Person(firstName,&nbsp;lastName,&nbsp;age)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//私有变量：&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_firstName&nbsp;=&nbsp;firstName;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;_lastName&nbsp;=&nbsp;lastName;&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//公共变量:&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age&nbsp;=&nbsp;age;&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//方法：&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.getName&nbsp;=&nbsp;function()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(firstName&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;lastName);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.SayHello&nbsp;=&nbsp;function()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;firstName&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;lastName);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;Person("Bill",&nbsp;"Gates",&nbsp;53);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;new&nbsp;Person("Steve",&nbsp;"Jobs",&nbsp;53);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.getName()&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;BillGates.age);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.firstName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里不能访问到私有变量</code></p><br/>    很显然，这种模型的类描述特别象C#语言的描述形式，在一个构造函数里依次定义了私有成员、公共属性和可用的方法，显得非常优雅嘛。特别是“闭包”机制可以模拟对私有成员的保护机制，做得非常漂亮。<br/><br/>    所谓的“闭包”，就是在构造函数体内定义另外的函数作为目标对象的方法函数，而这个对象的方法函数反过来引用外层外层函数体中的临时变量。这使得只要目标对象在生存期内始终能保持其方法，就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束，临时变量的名称也都消失了，但在目标对象的方法内却始终能引用到该变量的值，而且该值只能通这种方法来访问。即使再次调用相同的构造函数，但只会生成新对象和方法，新的临时变量只是对应新的值，和上次那次调用的是各自独立的。的确很巧妙！<br/><br/>    但是前面我们说过，给每一个对象设置一份方法是一种很大的浪费。还有，“闭包”这种间接保持变量值的机制，往往会给JavaSript的垃圾回收器制造难题。特别是遇到对象间复杂的循环引用时，垃圾回收的判断逻辑非常复杂。无独有偶，IE浏览器早期版本确实存在JavaSript垃圾回收方面的内存泄漏问题。再加上“闭包”模型在性能测试方面的表现不佳，微软最终放弃了“闭包”模型，而改用“原型”模型。正所谓“有得必有失”嘛。<br/><br/>    原型模型需要一个构造函数来定义对象的成员，而方法却依附在该构造函数的原型上。大致写法如下：<br/><br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;//定义构造函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Person(name)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&nbsp;&nbsp;&nbsp;//在构造函数中定义成员&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;//方法定义到构造函数的prototype上&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;=&nbsp;function()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;//子类构造函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Employee(name,&nbsp;salary)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.call(this,&nbsp;name);&nbsp;&nbsp;&nbsp;&nbsp;//调用上层构造函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.salary&nbsp;=&nbsp;salary;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//扩展的成员&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;//子类构造函数首先需要用上层构造函数来建立prototype对象，实现继承的概念&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Employee.prototype&nbsp;=&nbsp;new&nbsp;Person()&nbsp;&nbsp;&nbsp;//只需要其prototype的方法，此对象的成员没有任何意义！&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;//子类方法也定义到构造函数之上&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;Employee.prototype.ShowMeTheMoney&nbsp;=&nbsp;function()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name&nbsp;+&nbsp;"&nbsp;$"&nbsp;+&nbsp;this.salary);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;Person("Bill&nbsp;Gates");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;new&nbsp;Employee("Steve&nbsp;Jobs",&nbsp;1234);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.ShowMeTheMoney();</code></p><br/>    原型类模型虽然不能模拟真正的私有变量，而且也要分两部分来定义类，显得不怎么“优雅”。不过，对象间的方法是共享的，不会遇到垃圾回收问题，而且性能优于“闭包”模型。正所谓“有失必有得”嘛。<br/><br/>    在原型模型中，为了实现类继承，必须首先将子类构造函数的prototype设置为一个父类的对象实例。创建这个父类对象实例的目的就是为了构成原型链，以起到共享上层原型方法作用。但创建这个实例对象时，上层构造函数也会给它设置对象成员，这些对象成员对于继承来说是没有意义的。虽然，我们也没有给构造函数传递参数，但确实创建了若干没有用的成员，尽管其值是undefined，这也是一种浪费啊。<br/><br/>    唉！世界上没有完美的事情啊！<br/><br/><b>原型真谛</b><br/><br/>    正当我们感概万分时，天空中一道红光闪过，祥云中出现了观音菩萨。只见她手持玉净瓶，轻拂翠柳枝，洒下几滴甘露，顿时让JavaScript又添新的灵气。<br/><br/>    观音洒下的甘露在JavaScript的世界里凝结成块，成为了一种称为“语法甘露”的东西。这种语法甘露可以让我们编写的代码看起来更象对象语言。<br/><br/>    要想知道这“语法甘露”为何物，就请君侧耳细听。<br/><br/>    在理解这些语法甘露之前，我们需要重新再回顾一下JavaScript构造对象的过程。<br/><br/>    我们已经知道，用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步：第一步是建立一个新对象；第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象；第三步就是将该对象作为this参数调用构造函数，完成成员设置等初始化工作。对象建立之后，对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关，与构造函数再扯不上关系了。换句话说，构造函数只是在创建对象时起到介绍原型对象和初始化对象两个作用。<br/><br/>    那么，我们能否自己定义一个对象来当作原型，并在这个原型上描述类，然后将这个原型设置给新创建的对象，将其当作对象的类呢？我们又能否将这个原型中的一个方法当作构造函数，去初始化新建的对象呢？例如，我们定义这样一个原型对象：<br/><p class="code"><code>&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;Person&nbsp;=&nbsp;&nbsp;//定义一个对象来作为原型类&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create:&nbsp;function(name,&nbsp;age)&nbsp;&nbsp;//这个当构造函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age&nbsp;=&nbsp;age;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHello:&nbsp;function()&nbsp;&nbsp;//定义方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HowOld:&nbsp;function()&nbsp;&nbsp;//定义方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name&nbsp;+&nbsp;"&nbsp;is&nbsp;"&nbsp;+&nbsp;this.age&nbsp;+&nbsp;"&nbsp;years&nbsp;old.");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};</code></p><br/>    这个JSON形式的写法多么象一个C#的类啊！既有构造函数，又有各种方法。如果可以用某种形式来创建对象，并将对象的内置的原型设置为上面这个“类”对象，不就相当于创建该类的对象了吗？<br/><br/>    但遗憾的是，我们几乎不能访问到对象内置的原型属性！尽管有些浏览器可以访问到对象的内置原型，但这样做的话就只能限定了用户必须使用那种浏览器。这也几乎不可行。<br/><br/>    那么，我们可不可以通过一个函数对象来做媒介，利用该函数对象的prototype属性来中转这个原型，并用new操作符传递给新建的对象呢？<br/><br/>    其实，象这样的代码就可以实现这一目标：<br/><br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;anyfunc(){};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个函数躯壳&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;anyfunc.prototype&nbsp;=&nbsp;Person;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将原型对象放到中转站prototype&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;new&nbsp;anyfunc();&nbsp;&nbsp;//新建对象的内置原型将是我们期望的原型对象</code></p><br/>    不过，这个anyfunc函数只是一个躯壳，在使用过这个躯壳之后它就成了多余的东西了，而且这和直接使用构造函数来创建对象也没啥不同，有点不爽。<br/><br/>    可是，如果我们将这些代码写成一个通用函数，而那个函数躯壳也就成了函数内的函数，这个内部函数不就可以在外层函数退出作用域后自动消亡吗？而且，我们可以将原型对象作为通用函数的参数，让通用函数返回创建的对象。我们需要的就是下面这个形式：<br/><br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;New(aClass,&nbsp;aParams)&nbsp;&nbsp;&nbsp;&nbsp;//通用创建函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;new_()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义临时的中转函数壳&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aClass.Create.apply(this,&nbsp;aParams);&nbsp;&nbsp;&nbsp;//调用原型中定义的的构造函数，中转构造逻辑及构造参数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_.prototype&nbsp;=&nbsp;aClass;&nbsp;&nbsp;&nbsp;&nbsp;//准备中转原型对象&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;new_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回建立最终建立的对象&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;Person&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义的类&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create:&nbsp;function(name,&nbsp;age)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age&nbsp;=&nbsp;age;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHello:&nbsp;function()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HowOld:&nbsp;function()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name&nbsp;+&nbsp;"&nbsp;is&nbsp;"&nbsp;+&nbsp;this.age&nbsp;+&nbsp;"&nbsp;years&nbsp;old.");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;New(Person,&nbsp;["Bill&nbsp;Gates",&nbsp;53]);&nbsp;&nbsp;//调用通用函数创建对象，并以数组形式传递构造参数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.HowOld();&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.constructor&nbsp;==&nbsp;Object);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出：true</code></p><br/>    这里的通用函数New()就是一个“语法甘露”！这个语法甘露不但中转了原型对象，还中转了构造函数逻辑及构造参数。<br/><br/>    有趣的是，每次创建完对象退出New函数作用域时，临时的new_函数对象会被自动释放。由于new_的prototype属性被设置为新的原型对象，其原来的原型对象和new_之间就已解开了引用链，临时函数及其原来的原型对象都会被正确回收了。上面代码的最后一句证明，新创建的对象的constructor属性返回的是Object函数。其实新建的对象自己及其原型里没有constructor属性，那返回的只是最顶层原型对象的构造函数，即Object。<br/><br/>    有了New这个语法甘露，类的定义就很像C#那些静态对象语言的形式了，这样的代码显得多么文静而优雅啊！<br/><br/>    当然，这个代码仅仅展示了“语法甘露”的概念。我们还需要多一些的语法甘露，才能实现用简洁而优雅的代码书写类层次及其继承关系。好了，我们再来看一个更丰富的示例吧：<br/><br/><p class="code"><code>&nbsp;&nbsp;&nbsp;&nbsp;//语法甘露：&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;object&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;//定义小写的object基本类，用于实现最基础的方法等&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isA:&nbsp;function(aType)&nbsp;&nbsp;&nbsp;//一个判断类与类之间以及对象与类之间关系的基础方法&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;self&nbsp;=&nbsp;this;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(self)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(self&nbsp;==&nbsp;aType)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self&nbsp;=&nbsp;self.Type;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;Class(aBaseClass,&nbsp;aClassDefine)&nbsp;&nbsp;&nbsp;&nbsp;//创建类的函数，用于声明类及继承关系&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;class_()&nbsp;&nbsp;&nbsp;//创建类的临时函数壳&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Type&nbsp;=&nbsp;aBaseClass;&nbsp;&nbsp;&nbsp;&nbsp;//我们给每一个类约定一个Type属性，引用其继承的类&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;member&nbsp;in&nbsp;aClassDefine)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this[member]&nbsp;=&nbsp;aClassDefine[member];&nbsp;&nbsp;&nbsp;&nbsp;//复制类的全部定义到当前创建的类&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class_.prototype&nbsp;=&nbsp;aBaseClass;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;class_();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;New(aClass,&nbsp;aParams)&nbsp;&nbsp;&nbsp;//创建对象的函数，用于任意类的对象创建&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;new_()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建对象的临时函数壳&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Type&nbsp;=&nbsp;aClass;&nbsp;&nbsp;&nbsp;&nbsp;//我们也给每一个对象约定一个Type属性，据此可以访问到对象所属的类&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(aClass.Create)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aClass.Create.apply(this,&nbsp;aParams);&nbsp;&nbsp;&nbsp;//我们约定所有类的构造函数都叫Create，这和DELPHI比较相似&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_.prototype&nbsp;=&nbsp;aClass;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;new_();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;};&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;//语法甘露的应用效果：&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;Person&nbsp;=&nbsp;Class(object,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//派生至object基本类&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create:&nbsp;function(name,&nbsp;age)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.age&nbsp;=&nbsp;age;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHello:&nbsp;function()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Hello,&nbsp;I'm&nbsp;"&nbsp;+&nbsp;this.name&nbsp;+&nbsp;",&nbsp;"&nbsp;+&nbsp;this.age&nbsp;+&nbsp;"&nbsp;years&nbsp;old.");&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;});&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;Employee&nbsp;=&nbsp;Class(Person,&nbsp;&nbsp;&nbsp;&nbsp;//派生至Person类，是不是和一般对象语言很相似？&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create:&nbsp;function(name,&nbsp;age,&nbsp;salary)&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.Create.call(this,&nbsp;name,&nbsp;age);&nbsp;&nbsp;//调用基类的构造函数&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.salary&nbsp;=&nbsp;salary;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMeTheMoney:&nbsp;function()&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.name&nbsp;+&nbsp;"&nbsp;$"&nbsp;+&nbsp;this.salary);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;});&lt;br/&gt;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;BillGates&nbsp;=&nbsp;New(Person,&nbsp;["Bill&nbsp;Gates",&nbsp;53]);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;SteveJobs&nbsp;=&nbsp;New(Employee,&nbsp;["Steve&nbsp;Jobs",&nbsp;53,&nbsp;1234]);&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.ShowMeTheMoney();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;LittleBill&nbsp;=&nbsp;New(BillGates.Type,&nbsp;["Little&nbsp;Bill",&nbsp;6]);&nbsp;&nbsp;&nbsp;//根据BillGate的类型创建LittleBill&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;LittleBill.SayHello();&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.isA(Person));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//true&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.isA(Employee));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//false&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(SteveJobs.isA(Person));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//true&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(Person.isA(Employee));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//false&lt;br/&gt;&nbsp;&nbsp;&nbsp;&nbsp;alert(Employee.isA(Person));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//true</code></p><br/>    “语法甘露”不用太多，只要那么一点点，就能改观整个代码的易读性和流畅性，从而让代码显得更优雅。有了这些语法甘露，JavaScript就很像一般对象语言了，写起代码了感觉也就爽多了！<br/><br/>    令人高兴的是，受这些甘露滋养的JavaScript程序效率会更高。因为其原型对象里既没有了毫无用处的那些对象级的成员，而且还不存在constructor属性体，少了与构造函数间的牵连，但依旧保持了方法的共享性。这让JavaScript在追溯原型链和搜索属性及方法时，少费许多工夫啊。<br/><br/>    我们就把这种形式称为“甘露模型”吧！其实，这种“甘露模型”的原型用法才是符合prototype概念的本意，才是的JavaScript原型的真谛！<br/><br/>    想必微软那些设计AJAX架构的工程师看到这个甘露模型时，肯定后悔没有早点把AJAX部门从美国搬到咱中国的观音庙来，错过了观音菩萨的点化。当然，我们也只能是在代码的示例中，把Bill Gates当作对象玩玩，真要让他放弃上帝转而皈依我佛肯定是不容易的，机缘未到啊！如果哪天你在微软新出的AJAX类库中看到这种甘露模型，那才是真正的缘分！<br/><br/><b>编程的快乐</b><br/><br/>    在软件工业迅猛发展的今天，各式各样的编程语言层出不穷，新语言的诞生，旧语言的演化，似乎已经让我们眼花缭乱。为了适应面向对象编程的潮流，JavaScript语言也在向完全面向对象的方向发展，新的JavaScript标准已经从语义上扩展了许多面向对象的新元素。与此相反的是，许多静态的对象语言也在向JavaScript的那种简洁而幽雅的方向发展。例如，新版本的C#语言就吸收了JSON那样的简洁表示法，以及一些其他形式的JavaScript特性。<br/><br/>    我们应该看到，随着RIA(强互联应用)的发展和普及，AJAX技术也将逐渐淡出江湖，JavaScript也将最终消失或演化成其他形式的语言。但不管编程语言如何发展和演化，编程世界永远都会在“数据”与“代码”这千丝万缕的纠缠中保持着无限的生机。只要我们能看透这一点，我们就能很容易地学习和理解软件世界的各种新事物。不管是已熟悉的过程式编程，还是正在发展的函数式编程，以及未来量子纠缠态的大规模并行式编程，我们都有足够的法力来化解一切复杂的难题。<br/><br/>    佛最后淡淡地说：只要我们放下那些表面的“类”，放下那些对象的“自我”，就能达到一种“对象本无根，类型亦无形”的境界，从而将自我融入到整个宇宙的生命轮循环中。我们将没有自我，也没有自私的欲望，你就是我，我就是你，你中有我，我中有你。这时，我们再看这生机勃勃的编程世界时，我们的内心将自然生起无限的慈爱之心，这种慈爱之心不是虚伪而是真诚的。关爱他人就是关爱自己，就是关爱这世界中的一切。那么，我们的心是永远快乐的，我们的程序是永远快乐的，我们的类是永远快乐的，我们的对象也是永远快乐的。这就是编程的极乐！<br/><br/>    说到这里，在座的比丘都犹如醍醐灌顶，心中豁然开朗。看看左边这位早已喜不自禁，再看看右边那位也是心花怒放。<br/><br/>    蓦然回首时，唯见君拈花微笑...]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/460.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=460</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=460&amp;key=4192a903</trackback:ping></item><item><title>风讯flash幻灯的源文件</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/378.html</link><pubDate>Mon, 17 Mar 2008 13:03:28 +0800</pubDate><guid>http://www.xunzou.com/blog/post/378.html</guid><description><![CDATA[风讯flash幻灯的源文件<br/>[file=uploads/200803/17_130400_6336.rar]源文件下载[/file]]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/378.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=378</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=378&amp;key=17faf738</trackback:ping></item><item><title>关于装系统后黑屏的问题</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/375.html</link><pubDate>Thu, 06 Mar 2008 11:48:51 +0800</pubDate><guid>http://www.xunzou.com/blog/post/375.html</guid><description><![CDATA[今天在 公司，给机器安装2003操作系统做测试用，谁知道装上之后能显示滚动条就是进不去系统，但是可以进入安全模式，我以为装的有问题就用重新装了一编，毛病依旧。<br/>我就找找啊！终于找到了问题所在！<br/>驱动问题：正常启动系统时，会加载手动安装的硬件三方驱动。 <br/><br/>操作方法是：你到安全模式下，把显卡、声卡、网卡的驱动通通给卸载掉。卸载方法是 桌面上 鼠标右击我的电脑—>属性—>硬件—>设备管理器 <br/>然后分别找到里面的显示卡、网络适配器、声音视频和游戏控制器。 <br/>右击—>卸载。做完这些工作后，重启电脑，应该就可以进入正常模式了`` <br/><br/>我再次强调，XP系统安装文件自带了一些驱动，把你的电脑的显卡或者声卡或者网卡给驱动了。 <br/>你难道没发现，很多电脑装了XP系统后，不需要装驱动就可以直接使用的吗？如声卡可以用AC97，显卡可以用AGI之类的。 <br/>这些XP系统里自带的有，装系统的时候，就给你装上了。而你的电脑硬件用这些驱动却不行，就是平时说的驱动的不兼容或者冲突！]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/375.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=375</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=375&amp;key=5b634f6b</trackback:ping></item><item><title>一个关于word的小问题</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/370.html</link><pubDate>Sun, 02 Mar 2008 17:25:45 +0800</pubDate><guid>http://www.xunzou.com/blog/post/370.html</guid><description><![CDATA[同学的论文刚才在里面插入东西后，后面的字就会自动消失。<br/>百度上找了一个原来是碰到了键盘上的insert键。<br/>这个insert键是切换插入与改写状态的！<br/>如果出现上述问题，按一下insert键就OK了！]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/370.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=370</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=370&amp;key=e16b4c33</trackback:ping></item><item><title>玩透弹出窗口</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/354.html</link><pubDate>Sun, 10 Feb 2008 16:45:16 +0800</pubDate><guid>http://www.xunzou.com/blog/post/354.html</guid><description><![CDATA[玩透弹出窗口 <br/>【1、最基本的弹出窗口代码】 <br/>其实代码非常简单： <br/><br/><SCRIPT LANGUAGE="javascript"> <br/><!-- <br/>window.open ('page.html') <br/>--> <br/></SCRIPT> <br/>因为着是一段javascripts代码，所以它们应该放在<SCRIPT LANGUAGE="javascript">标签和</script>之间。<!-- 和 -->是对一些版本低的浏览器起作用，在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。 <br/>window.open ('page.html') 用于控制弹出新的窗口page.html，如果page.html不与主窗口在同一路径下，前面应写明路径，绝对路径(http://)/和相对路径(../)均可。用单引号和双引号都可以，只是不要混用。 <br/>这一段代码可以加入HTML的任意位置，<head>和</head>之间可以，间也可以，越前越早执行，尤其是页面代码长，又想使页面早点弹出就尽量往前放。 <br/><br/>【2、经过设置后的弹出窗口】 <br/><br/>下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。 <br/>我们来定制这个弹出的窗口的外观，尺寸大小，弹出的位置以适应该页面的具体情况。 <br/><SCRIPT LANGUAGE="javascript"> <br/><!-- <br/>window.open ('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no') <br/>file://写/成一行 <br/>--> <br/></SCRIPT> <br/>参数解释： <br/><SCRIPT LANGUAGE="javascript"> js脚本开始； <br/>window.open 弹出新窗口的命令； <br/>'page.html' 弹出窗口的文件名； <br/>'newwindow' 弹出窗口的名字（不是文件名），非必须，可用空''代替； <br/>height=100 窗口高度； <br/>width=400 窗口宽度； <br/>top=0 窗口距离屏幕上方的象素值； <br/>left=0 窗口距离屏幕左侧的象素值； <br/>toolbar=no 是否显示工具栏，yes为显示； <br/>menubar，scrollbars 表示菜单栏和滚动栏。 <br/>resizable=no 是否允许改变窗口大小，yes为允许； <br/>location=no 是否显示地址栏，yes为允许； <br/>status=no 是否显示状态栏内的信息（通常是文件已经打开），yes为允许； <br/></SCRIPT> js脚本结束 <br/><br/>【3、用函数控制弹出窗口】 <br/><br/>下面是一个完整的代码。 <br/> <br/><head> <br/><script LANGUAGE="JavaScript"> <br/><!-- <br/>function openwin() { window.open ("page.html", "newwindow", "height=100, width=400, toolbar= <br/>no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br/>file://写/成一行 <br/>} <br/>file://--/> <br/></script> <br/></head> <br/><body onload="openwin()"> <br/>...任意的页面内容... <br/> <br/> <br/>这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。 <br/>怎么调用呢？ <br/>方法一：<body onload="openwin()"> 浏览器读页面时弹出窗口； <br/>方法二：<body onunload="openwin()"> 浏览器离开页面时弹出窗口； <br/>方法三：用一个连接调用： <br/><a href="#" onclick="openwin()">打开一个窗口</a> <br/>注意：使用的“#”是虚连接。 <br/>方法四：用一个按钮调用： <br/><input type="button" onclick="openwin()" value="打开窗口"> <br/><br/>【4、同时弹出2个窗口】 <br/><br/>对源代码稍微改动一下： <br/><script LANGUAGE="JavaScript"> <br/><!-- <br/>function openwin() <br/>{ window.open ("page.html", "newwindow", "height=100, width=100, top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br/>file://写/成一行 <br/>window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br/>file://写/成一行 <br/>} <br/>file://--/> <br/></script> <br/>为避免弹出的2个窗口覆盖，用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。 <br/><br/>注意：2个窗口的name(newwindows和newwindow2)不要相同，或者干脆全部为空。OK？ <br/><br/>【5、主窗口打开文件1.htm，同时弹出小窗口page.html】 <br/><br/>如下代码加入主窗口<head>区： <br/><script language="javascript"> <br/><!-- <br/>function openwin() <br/>{window.open("page.html","","width=200,height=200") <br/>} <br/>file://--/> <br/></script> <br/>加入区： <br/><a href="1.htm" onclick="openwin()">open</a>即可。 <br/><br/>【6、弹出的窗口之定时关闭控制】 <br/><br/>下面我们再对弹出的窗口进行一些控制，效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中，可不是主页面中，否则...)，让它10秒后自动关闭是不是更酷了？ <br/><br/>首先，将如下代码加入page.html文件的<head>区： <br/><script language="JavaScript"> <br/>function closeit() <br/>{setTimeout("self.close()",10000) file://毫/秒} <br/></script> <br/>然后，再用<body onload="closeit()"> 这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊！这一句的作用是调用关闭窗口的代码，10秒钟后就自行关闭该窗口。) <br/><br/>【7、在弹出窗口中加上一个关闭按钮】 <br/><br/><FORM> <br/><INPUT TYPE='BUTTON' VALUE='关闭' onClick='window.close()'> <br/></FORM> <br/>呵呵，现在更加完美了！ <br/><br/>【8、内包含的弹出窗口-一个页面两个窗口】 <br/><br/>上面的例子都包含两个窗口，一个是主窗口，另一个是弹出的小窗口。 <br/><br/>通过下面的例子，你可以在一个页面内完成上面的效果。 <br/> <br/><head> <br/><SCRIPT LANGUAGE="JavaScript"> <br/>function openwin() <br/>{OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no"); <br/>file://写/成一行 <br/>OpenWindow.document.write("<TITLE>例子</TITLE>") <br/>OpenWindow.document.write("<BODY BGCOLOR=#ffffff>") <br/>OpenWindow.document.write("<h1>Hello!</h1>") <br/>OpenWindow.document.write("New window opened!") <br/>OpenWindow.document.write("</BODY>") <br/>OpenWindow.document.write("</HTML>") <br/>OpenWindow.document.close()} <br/></SCRIPT> <br/></head> <br/> <br/><a href="#" onclick="openwin()">打开一个窗口</a> <br/><input type="button" onclick="openwin()" value="打开窗口"> <br/> <br/> <br/>看看 OpenWindow.document.write()里面的代码不就是标准的HTML吗？只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用OpenWindow.document.close()结束啊。 <br/><br/>【9、终极应用--弹出的窗口之Cookie控制】 <br/><br/>回想一下，上面的弹出窗口虽然酷，但是有一点小毛病(沉浸在喜悦之中，一定没有发现吧？)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页)，那么每次刷新这个页面，窗口都会弹出一次，是不是非常烦人？:-(有解决的办法吗？Yes! ;-) Follow me. <br/><br/>我们使用cookie来控制一下就可以了。 <br/><br/>首先，将如下代码加入主页面HTML的<HEAD>区： <br/><script> <br/>function openwin() <br/>{window.open("page.html","","width=200,height=200")} <br/>function get_cookie(Name) <br/>{var search = Name + "=" <br/>var returnvalue = ""; <br/>if (document.cookie.length > 0) { <br/>offset = document.cookie.indexOf(search) <br/>if (offset != -1) { <br/>offset += search.length <br/>end = document.cookie.indexOf(";", offset); <br/>if (end == -1) <br/>end = document.cookie.length; <br/>returnvalue=unescape(document.cookie.substring(offset,end)) <br/>} <br/>} <br/>return returnvalue; <br/>} <br/>function loadpopup(){ <br/>if (get_cookie('popped')==''){ <br/>openwin() <br/>document.cookie="popped=yes" <br/>} <br/>} <br/></script> <br/>然后，用<body onload="loadpopup()">（注意不是openwin而是loadpop啊！）替换主页面中原有的<BODY>这一句即可。你可以试着刷新一下这个页面或重新进入该页面，窗口再也不会弹出了。真正的Pop-Only-Once！]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/354.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=354</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=354&amp;key=545b1236</trackback:ping></item><item><title>DM分区软件使用详解</title><author>xunzou@gmail.com (冰剑)</author><link>http://www.xunzou.com/blog/post/334.html</link><pubDate>Mon, 31 Dec 2007 00:15:35 +0800</pubDate><guid>http://www.xunzou.com/blog/post/334.html</guid><description><![CDATA[硬盘分区是我们曰常维护中必须掌握的一个基本知识，随着大容量硬盘的出现，Fdisk的缺点逐渐显示在我们面前。在分区时，Fdisk已经不能对容量在120G以上的硬盘进行分区操作，而且在对大容量硬盘进行分区操作时，Fdisk的速度让我们难以忍受。<br/>DM分区软件的出现，解决了这一操作难题，DM最明显的一个特点就是分区速度快，运行多种分区格式。DM虽然问世很久了，并且有很多人在使用，由于分区对新来来说，毕竟是一项高难度的工作，而且DM满脸英文面孔，又增加了学习这个软件的难度。<br/>目前世面上Windows 98无忧启动盘中，已经附带了DM分区软件。如果没有此软件，可以到网上下载，下载后，将软件放在启动盘中，启动机器后，运行DM就进入了DM分区软件的主菜单（如图一）。<br/>选择菜单可以使用键盘上的四个方向键（↑→↓←），或者直接点一下开头的键。如图一中，我们要进入Easy Disk Installation菜单，可以直接接一下E。<br/><img onload="ResizeImage(this,520)" src="http://article.mmbest.com/article/UploadPic/2006-5/2006514142735348.jpg" alt="" title=""/><br/>（图一）<br/>一、Easy Disk installatin：硬盘自动分区选项，此项为DM提供的硬盘自动分区选项。选择此选项后，DM会根据你的硬盘容量，自动进行分区操作。此功能适用于初学者，由于自动分区无法按照我们的要求对硬盘进行分区，因此一般很少使用该功能。<br/>二、Advanced Options：高级选项，此选项为DM提供的手动分区高级选项。选择此功能菜单，然后会出现一个二级子菜单（如图二）。<br/><img onload="ResizeImage(this,520)" src="http://article.mmbest.com/article/UploadPic/2006-5/2006514142736196.jpg" alt="" title=""/><br/>（图二）<br/>二级子菜单共有三个选项，这三个选项的功能分别是：Advanced Disk Installation的功能是硬盘分区高级选项；Maintenance Options的功能是维护选项；Upgrade Disk Manager的功能是根据你硬盘的物理参数修改升级DM中的硬盘驱动程序ONTRACKD.SYS，以及当你的硬盘（仅限于IBM）容量大于8.4G且主板BIOS不能识别时把驱动程序装入硬盘使系统能识别8.4G以上的硬盘。<br/>三、分区操作实例：<br/>1、选择Advanced Disk Installation选项，DM会自动搜索计算机中的所有硬盘，如果你的计算机只有一个硬盘，直接接回车后，系统会提示使用哪种分区格式，NTFS、FAT32还是FAT格式的分区，我们根据需要选择一种分区格式就可以了。确认使用哪种分区格式后，系统还会要求确认。<br/>2、进行分区大小选择如图三<br/><img onload="ResizeImage(this,520)" src="http://article.mmbest.com/article/UploadPic/2006-5/2006514142737912.jpg" alt="" title=""/><br/>（图三）<br/>由于我们要自己设置每个分区的大小，因此前两个自动分区的选项不予考虑，直接选择Option（C）Define your own手动对硬盘进行分区。<br/>3、设置每个分区大小如图四<br/><img onload="ResizeImage(this,520)" src="http://article.mmbest.com/article/UploadPic/2006-5/2006514142737491.jpg" alt="" title=""/><br/>（图四）<br/>我们首先输入主分区的容量大小，然后依次输入每个逻辑分区的容量大小就可以了。这里需要注意，与Fdisk不同的是没有建立扩展分区这一选项。<br/>4、保存分区信息：<br/>完成上面的分区操作后，就可以选择Save and Continue选项，保存上面的分区信息，系统仍旧会提示确认。如果对哪一个分区容量不满意，可以按Del键删除分区后，重新建立分区。<br/>5、格式化分区：<br/>保存分区信息后，按Alt＋C继续操作，系统会提示是否对硬盘的各分区进行快速格式化，我们选择Ｙ对各分区进行快速格式化，系统仍旧会提示确认格式化操作。<br/>6、完成分区操作：<br/>所有的操作完成后，系统会提示重新启动计算机。所有分区操作，在重新启动计算机会生效。这里需要注意，格式化完成后，如果不出现重新启动计算机的提示，请不要重新启动计算机，否则可能会引起分区操作无效。<br/>四、DM的高级功能<br/>你只需要在主窗口中按“Alt＋M”进入其高级菜单。你会发现里面多出了一些选项，如图五<br/><img onload="ResizeImage(this,520)" src="http://article.mmbest.com/article/UploadPic/2006-5/2006514142738836.jpg" alt="" title=""/><br/>（图五）<br/>Edit/View Partitions（编辑/查看磁盘分区）、Format/Check Partitions（格式化/检查磁盘分区）、Maintenance Options（维护选项）、CMOS Options（CMOS选项）、View/Print Online Manaual（查看/打印在线帮助）、Exit Disk Manager（退出DM）。<br/>在这些高级功能中，我们需要了解维护选项和CMOS选项的部分功能。<br/>1、Maintenance Options（维护选项）：<br/>在维护选项中，我们可以对硬盘进行低级格式化，进入Maintenance Options（维护选项）后，选择Utilities（实用工具）后，系统会提示选择硬盘。选择硬盘后，出现一个Select Utility Option（选用实用工具选项）对话框，该对话框有2个选项：<br/>Zero Fill Drive　   对硬盘的一个扇区写零，这将擦去硬盘中的所有数据。<br/>Low Level Format　硬盘低级格式化，选定后，在出现的对话框中按Alt+C键即可开始对硬盘进行低级格式化操作。<br/>2、CMOS Options（CMOS选项）<br/>用来自动或手动更改CMOS硬盘类型。这个选项只能修改CMOS中的硬盘类型，我们可以利用这个功能，破坏CMOS信息，达到破坏BIOS密码的操作。因为CMOS信息被破坏后，部分版本的CMOS密码就会被破坏，但不适合于所有版本的CMOS。<br/>DM其他高级功能，留给大家自己去发现。]]></description><category>技术文档</category><comments>http://www.xunzou.com/blog/post/334.html#comment</comments><wfw:comment>http://www.xunzou.com/blog/</wfw:comment><wfw:commentRss>http://www.xunzou.com/blog/feed.asp?cmt=334</wfw:commentRss><trackback:ping>http://www.xunzou.com/blog/cmd.asp?act=tb&amp;id=334&amp;key=94974f11</trackback:ping></item></channel></rss>
