<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[我是李寒迪!]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[]]></description>
<link>http://hi.baidu.com/handylee</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[&#60;!--[if IE]&#62;....&#60;![endif]--&#62;详解]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/6523c4fc35a235fffc037fc5.html]]></link>
        <description><![CDATA[
		
		<div class="cnt">
<p>&lt;!--[if lte IE 6]&gt;.............&lt;![endif]--&gt;</p>
<p>Ite：less than or equal to意思是小于或等于IE6浏览器，用于IE浏览器的条件注释，常用于CSShack，针对IE的JS等。</p>
<p dragover="true">在进行WEB标准网页的学习和应用过程中，网页对浏览器的兼容性是经常接触到的一个问题。其中因微软公司的Internet Explorer(简称IE)占据浏览器市场的大半江山，此外还有<a target="_blank" href="http://www.cnbruce.com/blog/showlog.asp?cat_id=25&amp;log_id=732" class="blog_content">Firefox、Opera</a>等。需要对这些浏览器进行兼容。<br>
<br>
同时，单就IE而言，因IE版本的升级更替，目前浏览者使用的主要停留在 IE5(IE5.5)、IE6和IE7这三个版本中。而这3个版本对于我们制作的WEB标准网页（XHTML+CSS）解释执行的显示状况不尽相同。并 且，其他非IE浏览器与IE对某些CSS解释也不一样。所以，通过IE浏览器中的专有条件注释可有针对性的进行相关属性的定义。<br>
<br>
原文地址：<a target="_blank" href="http://www.quirksmode.org/css/condcom.html" class="blog_content">http://www.quirksmode.org/css/condcom.html</a> <br>
<br>
<strong>条件注释只能用于Explorer 5+ Windows(以下简称IE)</strong>(条件注释从IE5开始被支持)。如果你安装了多个IE，条件注释（Conditional comments）将会以最高版本的IE为标准（目前为IE 7）。<br>
<br>
<strong dragover="true">条件注释只能在windows Internet Explorer(以下简称IE)下使用</strong>，因此我们可以通过条件注释来为IE添加特别的指令。<br>
<br>
通俗点，条件注释就是一些if判断，但这些判断不是在脚本里执行的，而是直接在html代码里执行的，比如：<br>
<br>
<table width="100%" cellspacing="1" border="0" bgcolor="#cccccc" dragover="true">
    <tbody>
        <tr>
            <td bgcolor="#efefef" dragover="true"><br>
            &lt;!--[if IE]&gt;<br>
            这里是正常的html代码<br>
            &lt;![endif]--&gt;<br>
            <br>
            </td>
        </tr>
    </tbody>
</table>
<br>
1，条件注释的基本结构和HTML的注释(&lt;!-- --&gt;)是一样的。因此IE以外的浏览器将会把它们看作是普通的注释而完全忽略它们。 <br>
2，IE将会根据if条件来判断是否如解析普通的页面内容一样解析条件注释里的内容。 <br>
3，条件注释使用的是HTML的注释结构，因此他们只能使用在HTML文件里，而不能在CSS文件中使用。<br>
<br>
可使用如下代码检测当前IE浏览器的版本（注意：在非IE浏览器中是看不到效果的）<br>
<br>
&lt;!--[if IE]&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;h1&gt;您正在使用IE浏览器&lt;/h1&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;!--[if IE 5]&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;h2&gt;版本 5&lt;/h2&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;![endif]--&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;!--[if IE 5.0]&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;h2&gt;版本 5.0&lt;/h2&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;![endif]--&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;!--[if IE 5.5]&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;h2&gt;版本 5.5&lt;/h2&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;![endif]--&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;!--[if IE 6]&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;h2&gt;版本 6&lt;/h2&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;![endif]--&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;!--[if IE 7]&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;h2&gt;版本 7&lt;/h2&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;![endif]--&gt;<br>
&lt;![endif]--&gt;<br>
<br>
那如果当前的浏览器是IE，但版本比IE5还低，该怎么办呢，可以使用<strong>&lt;!--[if ls IE 5]&gt;</strong>，当然，根据条件注释只能在IE5+的环境之下，所以&lt;!--[if ls IE 5]&gt;根本不会被执行。<br>
<table width="100%" cellspacing="1" border="0" bgcolor="#cccccc">
    <tbody>
        <tr>
            <td bgcolor="#efefef"><br>
            lte：就是Less than or equal to的简写，也就是小于或等于的意思。<br>
            <br>
            lt ：就是Less than的简写，也就是小于的意思。<br>
            <br>
            gte：就是Greater than or equal to的简写，也就是大于或等于的意思。<br>
            <br>
            gt ：就是Greater than的简写，也就是大于的意思。<br>
            <br>
            ! ：就是不等于的意思，跟javascript里的不等于判断符相同<br>
            </td>
        </tr>
    </tbody>
</table>
<br>
<strong>Conditional comments属于CSS hack? 条件判断属于CSS hack吗？</strong><br>
<br>
严格地说是属于CSS hack。因为就好象其他真正的css hack一样，它使得我们可以给一些浏览器赋予特殊的样式，再则它不依赖于某个浏览器的BUG来控制另外一个浏览器（的样式）。除此之外，条件判断还能用 来做一些超出CSS HACK范围的事情(虽然这种情况很少发生)。<br>
<br>
因为条件判断不依赖于某个浏览器的hack,而是一个经过深思熟虑的特色功能，所以我相信它是可以被放心地使用的。当然，其他浏览器也有可能支持条件判断（到目前为止还没有），但是看起来，他们应该不会使用如&lt;!--[if IE]&gt;这样的语法。<br>
<br>
<strong>应该如何应用条件注释</strong><br>
<br>
本文一开始就说明了，因为IE各版本的浏览器对我们制作的WEB标准的页面解释不一样，具体就是对CSS的解释不同，我们为了兼容这些，可运用条件注释来各自定义，最终达到兼容的目的。比如：<br>
<br>
<table width="100%" cellspacing="1" border="0" bgcolor="#cccccc">
    <tbody>
        <tr>
            <td bgcolor="#efefef"><br>
            &lt;!-- 默认先调用css.css样式表 --&gt;<br>
            &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css.css&quot; /&gt;<br>
            <br>
            &lt;!--[if IE 7]&gt;<br>
            &lt;!-- 如果IE浏览器版是7,调用ie7.css样式表 --&gt;<br>
            &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;ie7.css&quot; /&gt;<br>
            &lt;![endif]--&gt;<br>
            <br>
            &lt;!--[if lte IE 6]&gt;<br>
            &lt;!-- 如果IE浏览器版本小于等于6,调用ie.css样式表 --&gt;<br>
            &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;ie.css&quot; /&gt;<br>
            &lt;![endif]--&gt;<br>
            </td>
        </tr>
    </tbody>
</table>
这其中就区分了IE7和IE6向下的浏览器对CSS的执行，达到兼容的目的。同时，首行默认的css.css还能与其他非IE浏览器实现兼容。<br>
<br>
<strong>注意：</strong>默认的CSS样式应该位于HTML文档的首行，进行条件注释判断的所有内容必须位于该默认样式之后。<br>
<br>
比如如下代码，<strong>在IE浏览器下执行显示为红色，而在非IE浏览器下显示为黑色</strong>。如果把条件注释判断放在首行，则不能实现。该例题很能说明网页对IE浏览器和非IE浏览器间的兼容性问题解决。</p>
<p>&lt;style type=&quot;text/css&quot;&gt;<br>
body{<br>
background-color: #000;<br>
}<br>
&lt;/style&gt;<br>
&lt;!--[if IE]&gt;<br>
&lt;style type=&quot;text/css&quot;&gt;<br>
body{<br>
background-color: #F00;<br>
}<br>
&lt;/style&gt;<br>
&lt;![endif]--&gt;<br>
<br>
同时，有人会试图使用<strong>&lt;!--[if !IE]&gt;</strong>来定义非IE浏览器下的状况，但注意：条件注释只有在IE浏览器下才能执行，这个代码在非IE浏览下非单不是执行该条件下的定义，而是当做注释视而不见。<br>
<br>
正常就是默认的样式，对IE浏览器需要特殊处理的，才进行条件注释。</p>
</div> <a href="http://hi.baidu.com/handylee/blog/item/6523c4fc35a235fffc037fc5.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/web2%2E0%26%2338%3Bjs%26%2338%3Bajax">web2.0&#38;js&#38;ajax</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/6523c4fc35a235fffc037fc5.html#comment">查看评论</a>]]></description>
        <pubDate>2007年08月31日 星期五  10:47</pubDate>
        <category><![CDATA[web2.0&#38;js&#38;ajax]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/6523c4fc35a235fffc037fc5.html</guid>
</item>

<item>
        <title><![CDATA[css在firefox/IE6/IE7浏览器下的兼容Hack]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/68be8054579e031d3a2935c1.html]]></link>
        <description><![CDATA[
		
		我只在这三种浏览器下测试<br>
<br>
#example { color: #333; } /* Moz Firefox */<br>
* html #example { color: #666; } /* IE6 */<br>
*+html #example { color: #999; } /* IE7 */<br>
<br>
那么在firefox下字体颜色显示为#333，IE6下字体颜色显示为#666，IE7下字体颜色显示为#999，他们都互不干扰。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/web2%2E0%26%2338%3Bjs%26%2338%3Bajax">web2.0&#38;js&#38;ajax</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/68be8054579e031d3a2935c1.html#comment">查看评论</a>]]></description>
        <pubDate>2007年08月30日 星期四  10:48</pubDate>
        <category><![CDATA[web2.0&#38;js&#38;ajax]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/68be8054579e031d3a2935c1.html</guid>
</item>

<item>
        <title><![CDATA[zt JSP/Servlet 中的汉字编码问题]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/df0a57b542e6fbcc36d3ca25.html]]></link>
        <description><![CDATA[
		
		<font size="2">来源:www.wengu.com<br>
</font><br>
<strong>JSP/Servlet 中的汉字编码问题<br>
</strong><blockquote><em>网上就 JSP/Servlet 中 DBCS 字符编码问题有许多优秀的文章和讨论，本文对它们作一些整理，并结合 IBM WebSphere Application Server 3.5（WAS）的解决方法作一些说明，希望它不是多余的。</em></blockquote>
<p><strong>内容：</strong><img width="1" height="1" src="http://www.raqu.com/Article/UploadFiles_wg/200610/2006102884532436.gif"><img width="1" height="4" src="http://www.raqu.com/Article/UploadFiles_wg/200610/2006102884532436.gif"> 问题的起源 GB2312-80，GBK，GB18030-2000 汉字字符集及 Encoding 中文转码时'?'、乱码的由来 JSP/Servlet 汉字编码问题及在 WAS 中的解决办法  结束语 参考文章</p>
<p><strong class="subhead">1. 问题的起源</strong> </p>
<p>&nbsp;&nbsp;&nbsp;    每个国家（或区域）都规定了计算机信息交换用的字符编码集，如美国的扩展 ASCII码, 中国的 GB2312-80，日本的 JIS 等，作为该国家/区域内信息处理的基础，有着统一编码的重要作用。字符编码集按长度分为 SBCS（单字节字符集），DBCS（双字节字符集）两大类。早期的软件（尤其是操作系统），为了解决本地字符信息的计算机处理，出现了各种本地化版本 （L10N），为了区分，引进了 LANG, Codepage 等概念。但是由于各个本地字符集代码范围重叠，相互间信息交换困难；软件各个本地化版本独立维护成本较高。因此有必要将本地化工作中的共性抽取出来，作一 致处理，将特别的本地化处理内容降低到最少。这也就是所谓的国际化（I18N）。各种语言信息被进一步规范为 Locale 信息。处理的底层字符集变成了几乎包含了所有字形的 Unicode。 </p>
<p>&nbsp;&nbsp;&nbsp;    现在大部分具有国际化特征的软件核心字符处理都是以 Unicode 为基础的，在软件运行时根据当时的 Locale/Lang/Codepage 设置确定相应的本地字符编码设置，并依此处理本地字符。在处理过程中需要实现 Unicode 和本地字符集的相互转换，甚或以 Unicode 为中间的两个不同本地字符集的相互转换。这种方式在网络环境下被进一步延伸，任何网络两端的字符信息也需要根据字符集的设置转换成可接受的内容。 </p>
<p>&nbsp;&nbsp;&nbsp;    Java 语言内部是用 Unicode 表示字符的，遵守 Unicode V2.0。Java 程序无论是从/往文件系统以字符流读/写文件，还是往 URL 连接写 HTML 信息，或从 URL 连接读取参数值，都会有字符编码的转换。这样做虽然增加了编程的复杂度，容易引起混淆，但却是符合国际化的思想的。 </p>
<p>&nbsp;&nbsp;    从理论上来说，这些根据字符集设置而进行的字符转换不应该产生太多问题。而事实是由于应用程序的实际运行环境不同，Unicode 和各个本地字符集的补充、完善，以及系统或应用程序实现的不规范，转码时出现的问题时时困扰着程序员和用户。 </p>
<p><strong class="subhead">2. GB2312-80，GBK，GB18030-2000 汉字字符集及 Encoding</strong> </p>
<p>&nbsp;&nbsp;    其实解决 JAVA 程序中的汉字编码问题的方法往往很简单，但理解其背后的原因，定位问题，还需要了解现有的汉字编码和编码转换。 </p>
<p>&nbsp;&nbsp;&nbsp;    GB2312-80 是在国内计算机汉字信息技术发展初始阶段制定的，其中包含了大部分常用的一、二级汉字，和 9 区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集，这也是最基本的中文字符集。其编码范围是高位0xa1－0xfe，低位也是 0xa1-0xfe；汉字从 0xb0a1 开始，结束于 0xf7fe； </p>
<p>&nbsp;&nbsp;&nbsp;    GBK 是 GB2312-80 的扩展，是向上兼容的。它包含了 20902 个汉字，其编码范围是 0x8140-0xfefe，剔除高位 0x80 的字位。其所有字符都可以一对一映射到 Unicode 2.0，也就是说 JAVA 实际上提供了 GBK 字符集的支持。这是现阶段 Windows 和其它一些中文操作系统的缺省字符集，但并不是所有的国际化软件都支持该字符集，感觉是他们并不完全知道 GBK 是怎么回事。值得注意的是它不是国家标准，而只是规范。随着 GB18030-2000国标的发布，它将在不久的将来完成它的历史使命。 </p>
<p>&nbsp;&nbsp;&nbsp;    GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字，增加了藏、蒙等少数民族的字形。GBK2K 从根本上解决了字位不够，字形不足的问题。它有几个特点， </p>
<ul>
    <li>它并没有确定所有的字形，只是规定了编码范围，留待以后扩充。 </li>
    <li>编码是变长的，其二字节部分与 GBK 兼容；四字节部分是扩充的字形、字位，其编码范围是首字节 0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39。 </li>
    <li>它的推广是分阶段的，首先要求实现的是能够完全映射到 Unicode 3.0 标准的所有字形。 </li>
    <li>它是国家标准，是强制性的。</li>
</ul>
现在还没有任何一个操作系统或软件实现了 GBK2K 的支持，这是现阶段和将来汉化的工作内容。
<p>Unicode 的介绍......就免了吧。 </p>
<p>JAVA 支持的encoding中与中文编程相关的有：(有几个在JDK文档中未列出) ASCII7-bit, 同 ascii7ISO8859-18-bit, 同 8859_1,ISO-8859-1,ISO_8859-1,latin1...GB2312-80同gb2312,gb2312-1980, EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB......GBK(注意大小写),同MS936UTF8UTF-8GB18030(现在只有IBM JDK1.3.?有支持), 同Cp1392,1392</p>
<p>&nbsp;&nbsp;    JAVA 语言采用Unicode处理字符. 但从另一个角度来说，在java程序中也可以采用非Unicode的转码，重要的是保证程序入口和出口的汉字信息不失真。如完全采用ISO-8859-1 来处理汉字也能达到正确的结果。网络上流行的许多解决方法，都属于这种类型。为了不致引起混淆，本文不对这种方法作讨论。 </p>
<p><strong class="subhead">3.  中文转码时'?'、乱码的由来</strong> </p>
<p>两个方向转换都有可能得到错误的结果： </p>
<ul>
    <li>Unicode--&gt;Byte,  如果目标代码集不存在对应的代码，则得到的结果是0x3f. <blockquote>如：<br>
    &quot;u00d6u00ecu00e9u0046u00bbu00f9&quot;.getBytes(&quot;GBK&quot;) 的结果是 &quot;?&igrave;&eacute;F?&ugrave;&quot;, Hex 值是3fa8aca8a6463fa8b4.
    <p>仔 细看一下上面的结果，你会发现u00ec被转换为0xa8ac, u00e9被转换为xa8a6... 它的实际有效位变长了！ 这是因为GB2312符号区中的一些符号被映射到一些公共的符号编码，由于这些符号出现在ISO-8859-1或其它一些SBCS字符集中，故它们在 Unicode中编码比较靠前，有一些其有效位只有8位，和汉字的编码重叠(其实这种映射只是编码的映射，在显示时仔细不是一样的。Unicode 中的符号是单字节宽，汉字中的符号是双字节宽) . 在Unicodeu00a0--u00ff 之间这样的符号有20个。了解这个特征非常重要！由此就不难理解为什么JAVA编程中，汉字编码的错误结果中常常会出现一些乱码(其实是符号字符), 而不全是'?'字符, 就比如上面的例子。</p>
    </blockquote></li>
    <li>Byte--&gt;Unicode,  如果Byte标识的字符在源代码集不存在，则得到的结果是0xfffd. <blockquote>如：<br>
    Byte ba[] = {(byte)0x81,(byte)0x40,(byte)0xb0,(byte)0xa1}; new String(ba,&quot;gb2312&quot;);
    <p>结果是&quot;?啊&quot;, hex 值是&quot;ufffdu554a&quot;. 0x8140 是GBK字符，按GB2312转换表没有对应的值，取ufffd. (请注意：在显示该uniCode时，因为没有对应的本地字符，所以也适用上一种情况，显示为一个&quot;?&quot;.)</p>
    </blockquote></li>
</ul>
<p>实际编程中，JSP/Servlet 程序得到错误的汉字信息，往往是这两个过程的叠加，有时甚至是两个过程叠加后反复作用的结果. </p>
<p><strong class="subhead">4. JSP/Servlet 汉字编码问题及在 WAS 中的解决办法</strong> </p>
<blockquote><strong>4.1 常见的 encoding 问题的现象</strong><br>
网上常出现的 JSP/Servlet encoding 问题一般都表现在 browser 或应用程序端，如:
<ul>
    <li>浏览器中看到的 Jsp/Servlet 页面中的汉字怎么都成了 &rsquo;?&rsquo; ? </li>
    <li>浏览器中看到的 Servlet 页面中的汉字怎么都成了乱码？ </li>
    <li>JAVA 应用程序界面中的汉字怎么都成了方块？ </li>
    <li>Jsp/Servlet 页面无法显示 GBK 汉字。 </li>
    <li>JSP 页面中内嵌在&lt;%...%&gt;,&lt;%=...%&gt;等Tag包含的 JAVA code 中的中文成了乱码，但页面的其它汉字是对的。 </li>
    <li>Jsp/Servlet 不能接收 form 提交的汉字。 </li>
    <li>JSP/Servlet 数据库读写无法获得正确的内容。</li>
</ul>
<p>隐藏在这些问题后面的是各种错误的字符转换和处理（除第3个外，是因为 Java font 设置错误引起的）。解决类似的字符 encoding 问题，需要了解 Jsp/Servlet 的运行过程，检查可能出现问题的各个点。 </p>
<p><strong>4.2 JSP/Servlet web 编程时的 encoding 问题</strong><br>
运行于Java 应用服务器的 JSP/Servlet 为 Browser 提供 HTML 内容，其过程如下图所示： </p>
<p><img width="807" hspace="50" height="181" src="http://www.raqu.com/Article/UploadFiles_wg/200610/2006102884532422.gif"> </p>
<p>其中有字符编码转换的地方有: </p>
<ul>
    <li>JSP 编译。Java 应用服务器将根据 JVM 的 file.encoding 值读取 JSP 源文件，编译生成 JAVA 源文件，再根据 file.encoding 值写回文件系统。如果当前系统语言支持 GBK，那么这时候不会出现 encoding 问题。如果是英文的系统，如 LANG 是 en_US 的 Linux, AIX 或 Solaris，则要将 JVM 的 file.encoding 值置成 GBK 。系统语言如果是 GB2312，则根据需要，确定要不要设置 file.encoding，将 file.encoding 设为 GBK 可以解决潜在的 GBK 字符乱码问题 <br>
    <br>
    </li>
    <li>Java 需要被编译为 .class 才能在 JVM 中执行，这个过程存在与a.同样的 file.encoding 问题。从这里开始 servlet 和 jsp 的运行就类似了，只不过 Servlet 的编译不是自动进行的。对于JSP程序, 对产生的JAVA 中间文件的编译是自动进行的(在程序中直接调用sun.tools.javac.Main类). 因此如果在这一步出现问题的话, 也要检查encoding和OS的语言环境，或者将内嵌在JSP JAVA Code 中的静态汉字转为 Unicode, 要么静态文本输出不要放在 JAVA code 中。 对于Servlet, javac 编译时手工指定-encoding 参数就可以了。 <br>
    <br>
    </li>
    <li>Servlet 需要将 HTML 页面内容转换为 browser 可接受的 encoding 内容发送出去。依赖于各 JAVA App Server 的实现方式，有的将查询 Browser 的 accept-charset 和 accept-language 参数或以其它猜的方式确定 encoding 值，有的则不管。因此采用固定encoding 也许是最好的解决方法。对于中文网页，可在 JSP 或 Servlet 中设置 contentType=&quot;text/html; charset=GB2312&quot;；如果页面中有GBK字符，则设置为contentType=&quot;text/html; charset=GBK&quot;，由于IE 和 Netscape对GBK的支持程度不一样，作这种设置时需要测试一下。<br>
    因为16位 JAVA char在网络传送时高8位会被丢弃，也为了确保Servlet页面中的汉字（包括内嵌的和servlet运行过程中得到的）是期望的内码，可以用 PrintWriter out=res.getWriter() 取代 ServletOutputStream out=res.getOutputStream(). PrinterWriter 将根据contentType中指定的charset作转换 (ContentType需在此之前指定！); 也可以用OutputStreamWriter封装 ServletOutputStream 类并用write(String)输出汉字字符串。<br>
    对于 JSP，JAVA Application Server 应当能够确保在这个阶段将嵌入的汉字正确传送出去。 <br>
    <br>
    </li>
    <li>这 是解释 URL 字符 encoding 问题。如果通过 get/post 方式从 browser 返回的参数值中包含汉字信息， servlet 将无法得到正确的值。SUN的 J2SDK 中，HttpUtils.parseName 在解析参数时根本没有考虑 browser 的语言设置，而是将得到的值按 byte 方式解析。这是网上讨论得最多的 encoding 问题。因为这是设计缺陷，只能以 bin 方式重新解析得到的字符串；或者以 hack HttpUtils 类的方式解决。参考文章 2 均有介绍，不过最好将其中的中文 encoding GB2312、 CP1381 都改为 GBK，否则遇到 GBK 汉字时，还是会有问题。 <br>
    Servlet API 2.3 提供一个新的函数 HttpServeletRequest.setCharacterEncoding 用于在调用 request.getParameter(&ldquo;param_name&rdquo;) 前指定应用程序希望的 encoding，这将有助于彻底解决这个问题。</li>
</ul>
<p><strong>4.3 IBM Websphere Application Server 中的解决方法 </strong></p>
<p>WebSphere Application Server 对标准的 Servlet API 2.x 作了扩展，提供较好的多语言支持。运行在中文的操作系统中，可以不作任何设置就可以很好地处理汉字。下面的说明只是对WAS是运行在英文的系统中，或者需 要有GBK支持时有效。 </p>
<p>上述c,d情况，WAS 都要查询 Browser 的语言设置，在缺省状况下， zh, zh-cn 等均被映射为 JAVA encoding CP1381（注意： CP1381 只是等同于 GB2312 的一个 codepage，没有 GBK 支持）。这样做我想是因为无法确认 Browser 运行的操作系统是支持GB2312, 还是 GBK，所以取其小。但是实际的应用系统还是要求页面中出现 GBK 汉字，最著名的是朱总理名字中的&ldquo;镕&quot;(rong2 ，0xe946，u9555)，所以有时还是需要将 Encoding/Charset 指定为 GBK。当然 WAS 中变更缺省的 encoding 没有上面说的那么麻烦，针对 a,b，参考文章 5，在 Application Server 的命令行参数中指定 -Dfile.encoding=GBK 即可； 针对 d，在 Application Server 的命令行参数中指定-Ddefault.client.encoding=GBK。如果指定了-Ddefault.client.encoding= GBK，那么c情况下可以不再指定charset。 </p>
<p>上面列出的问题中还有一个关于Tag&lt;%...%&gt;,&lt;% =...%&gt;中的 JAVA 代码里包含的静态文本未能正确显示的问题，在WAS中的解决方法是除了设置正确的file.encoding, 还需要以相同方法设置-Duser.language=zh -Duser.region=CN。这与JAVA locale的设置有关。 </p>
<p><strong>4.4 数据库读写时的 encoding 问题</strong> </p>
<p>JSP/Servlet 编程中经常出现 encoding 问题的另一个地方是读写数据库中的数据。 </p>
<p>流 行的关系数据库系统都支持数据库 encoding，也就是说在创建数据库时可以指定它自己的字符集设置，数据库的数据以指定的编码形式存储。当应用程序访问数据时，在入口和出口处都会有 encoding 转换。 对于中文数据，数据库字符编码的设置应当保证数据的完整性. GB2312，GBK，UTF-8 等都是可选的数据库 encoding；也可以选择 ISO8859-1 (8-bit)，那么应用程序在写数据之前须将 16Bit 的一个汉字或 Unicode 拆分成两个 8-bit 的字符，读数据之后则需将两个字节合并起来，同时还要判别其中的 SBCS 字符。没有充分利用数据库 encoding 的作用，反而增加了编程的复杂度，ISO8859-1不是推荐的数据库 encoding。JSP/Servlet编程时，可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。 </p>
<p>然后应当注意的是读出来的数据的 encoding，JAVA 程序中一般得到的是 Unicode。写数据时则相反。 </p>
<p><strong>4.5 定位问题时常用的技巧</strong> </p>
<p>定 位中文encoding问题通常采用最笨的也是最有效的办法&mdash;&mdash;在你认为有嫌疑的程序处理后打印字符串的内码。通过打印字符串的内码，你可以发现什么时候 中文字符被转换成Unicode，什么时候Unicode被转回中文内码，什么时候一个中文字成了两个 Unicode 字符，什么时候中文字符串被转成了一串问号，什么时候中文字符串的高位被截掉了&hellip;&hellip; </p>
<p>取用合适的样本字符串也有助于区分问题的类型。如：&rdquo;aa啊aa丂aa&rdquo; 等中英相间、GB、GBK特征字符均有的字符串。一般来说，英文字符无论怎么转换或处理，都不会失真（如果遇到了，可以尝试着增加连续的英文字母长度）。</p>
</blockquote>
<p><strong class="subhead">5. 结束语</strong> </p>
<p>其 实 JSP/Servlet 的中文encoding 并没有想像的那么复杂，虽然定位和解决问题没有定规，各种运行环境也各不尽然，但后面的原理是一样的。了解字符集的知识是解决字符问题的基础。不过，随着 中文字符集的变化，不仅仅是 java 编程，中文信息处理中的问题还是会存在一段时间的。 </p> <a href="http://hi.baidu.com/handylee/blog/item/df0a57b542e6fbcc36d3ca25.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/Java">Java</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/df0a57b542e6fbcc36d3ca25.html#comment">查看评论</a>]]></description>
        <pubDate>2007年08月28日 星期二  13:56</pubDate>
        <category><![CDATA[Java]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/df0a57b542e6fbcc36d3ca25.html</guid>
</item>

<item>
        <title><![CDATA[基于Jquery的Slide 第一次写英文 头晕.]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/afc18e026141730d4afb5146.html]]></link>
        <description><![CDATA[
		
		<p><a rel="nofollow" href="http://groups.google.com/group/handylee/web/1.jpg" style="border: 0pt none ; clear: right; float: right; margin-bottom: 1em; margin-left: 1em; background-color: transparent;"><img src="http://groups.google.com/group/handylee/web/1.jpg?display=thumb&amp;width=420&amp;height=420" style="border: 0pt none ;"></a><font size="4"><span>&nbsp;&nbsp;&nbsp;  One day, I</span></font><font size="2" face="Trebuchet MS"><font size="4"><span> lounged in my PC.I found a Flash from my Flash8 folder like the picture right. It like a fade show. I thinked i could do it use Javascript too.So i worked on it </span></font></font><big><font size="2" face="Trebuchet MS"><font size="4"><span>immediately.</span></font></font></big></p>
<big><font size="2" face="Trebuchet MS"><font size="4"><span>&nbsp;&nbsp;&nbsp;  I used Jquery.</span></font></font></big>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span>it can really made you use less time to finnish more work, I like it!  </span></font></font></big></p>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span>&nbsp;&nbsp;&nbsp;  Two hours was done, the work was finished.i packaged the wedget.You can use it like this:</span></font></font></big></p>
<ul>
    <li><big><font size="2" face="Trebuchet MS"><font size="4"><span>Import the jquery.js and the wedget js file</span></font></font></big></li>
</ul>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span>&nbsp;&nbsp;&nbsp;&nbsp;   <font size="2">  &lt;script src=&quot;jquery.js&quot;&gt;&lt;/script&gt;</font></span></font></font></big><font size="2"><br>
<font face="Trebuchet MS"><span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &lt;script src=&quot;ppt.js&quot;&gt;&lt;/script&gt;</span></font></font></p>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span> </span></font></font></big></p>
<ul>
    <li><big><font size="2" face="Trebuchet MS"><font size="4"><span>Bulid a div element in the page<br>
    </span></font></font></big></li>
</ul>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;<span> <font size="2">&lt;div id=&quot;container&quot;&gt;&lt;/div&gt;</font></span><br>
</span></font></font></big></p>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span><br>
</span></font></font></big></p>
<ul>
    <li><big><font size="2" face="Trebuchet MS"><font size="4"><span>The last</span></font><br>
    </font></big></li>
</ul>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &lt;script language=&quot;javascript&quot;&gt;</font></p>
<p><font size="2">&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;    /* the contents upon the pictures. */<br>
</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  var contentArray = [&quot;&lt;dt&gt;Summer salad&lt;/dt&gt;&lt;dd&gt;Butter lettuce with apples, bloo&lt;/dd&gt;&quot;,<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &quot;&lt;dt&gt;Summer salad&lt;/dt&gt;&lt;dd&gt;Butter lettuce with apples, bloo&lt;/dd&gt;&quot;  </font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  ];</font></p>
<p><font size="2">&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;    /* the  pictures Array. */</font></p>
<p><font size="2">&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  var imgArray = [&quot;images/image0.jpg&quot;,<br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &quot;images/image1.jpg&quot;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  ];</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  /* Options */</font></p>
<p><font size="2">&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;    var options = {width:700,</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;    &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;    height:150,</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;    size:&quot;12px&quot;,</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  opacity:0.8};<br>
</font></p>
<p><font size="2">&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  /* Run!!  */</font></p>
<p><font size="2"> </font><br>
</p>
<p><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  PPT(&quot;container&quot;, contentArray,imgArray,options);<br>
</font></p>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &lt;/script&gt;  </font> </span></font></font></big></p>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span> </span></font></font></big></p>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span>&nbsp;&nbsp;&nbsp;  That's all.  you will see it with your IE or Firefox (yes!It can work in IE and Firefox) Figure A<br>
</span></font></font></big></p>
<p><big><font size="2" face="Trebuchet MS"><font size="4"><span>,change the options {width:650;height:200,size:&quot;13px&quot;,opacity:0.6} (Figure B)<br>
</span></font></font></big></p>
<p style="clear: both; text-align: center;"><a rel="nofollow" href="http://groups.google.com/group/handylee/web/2.jpg" style="border: 0pt none ; margin-left: 1em; margin-right: 1em; background-color: transparent;"><img src="http://groups.google.com/group/handylee/web/2.jpg?display=thumb&amp;width=200&amp;height=200" style="border: 0pt none ;"></a></p>
<p style="text-align: center;"><big><font size="2" face="Trebuchet MS"><font size="4"><span> <font size="1"><span>Figure A</span></font> </span></font></font></big></p>
<p style="clear: both; text-align: center;"><a rel="nofollow" href="http://groups.google.com/group/handylee/web/2%20%282%29.jpg" style="border: 0pt none ; margin-left: 1em; margin-right: 1em; background-color: transparent;"><img src="http://groups.google.com/group/handylee/web/2%20%282%29.jpg?display=thumb&amp;width=200&amp;height=200" style="border: 0pt none ;"></a></p>
<p style="text-align: center;"><big><font size="2" face="Trebuchet MS"><font size="4"><span><font size="1"><span>Figure B</span></font></span></font></font></big></p>
<p style="text-align: left;"><big><font size="2" face="Trebuchet MS"><font size="4"><span>&nbsp;&nbsp;&nbsp;  It's well done. when you click the next button on the panel, the current picture  will fade out,and next one fade in.  I also write another effect:slide Up and slide Down show, but i have not packaged that effect.You can view all effects  in  the file i uploaded.  <a rel="nofollow" href="http://groups.google.com/group/handylee/web/PPT.rar">Click Here To Download All Files</a>.</span></font></font></big></p>
<p style="text-align: left;"><big><font size="2" face="Trebuchet MS"><font size="4"><span>&nbsp;&nbsp;&nbsp;  Thanks.</span></font></font></big></p> <a href="http://hi.baidu.com/handylee/blog/item/afc18e026141730d4afb5146.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/web2%2E0%26%2338%3Bjs%26%2338%3Bajax">web2.0&#38;js&#38;ajax</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/afc18e026141730d4afb5146.html#comment">查看评论</a>]]></description>
        <pubDate>2007年08月20日 星期一  20:04</pubDate>
        <category><![CDATA[web2.0&#38;js&#38;ajax]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/afc18e026141730d4afb5146.html</guid>
</item>

<item>
        <title><![CDATA[终于能上了]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/fc954a2386c15f509822ed0f.html]]></link>
        <description><![CDATA[
		
		<p>前一段日子,公司里封了443端口,很多基于https链接的登录站点 不能上,包括百度,</p>
<p>我一直在校内网混(<a href="http://www.xiaonei.com">www.xiaonei.com</a>)</p>
<p>现在终于解封了,还是百度的速度快,</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%D0%A1%BC%C7">小记</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/fc954a2386c15f509822ed0f.html#comment">查看评论</a>]]></description>
        <pubDate>2007年08月17日 星期五  19:50</pubDate>
        <category><![CDATA[小记]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/fc954a2386c15f509822ed0f.html</guid>
</item>

<item>
        <title><![CDATA[好用的UML工具]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/73f2753180e32118ebc4af8e.html]]></link>
        <description><![CDATA[
		
		<p>今天在网上发现一个好东东,不错的uml工具,Trufun Plato/Kant 2007</p>
<p>中文的.支持Java,c++,.net,基于eclipse平台,设计UML十分方便,支持模型-代码互相转换.</p>
<p>下载下来,里面自带了一个example,图书馆管理系统, 不过我的uml基本算是菜鸟一级,以后要多练练,</p>
<p>明天准备买火车票 去南方找工作去,无锡的有家公司让去签约,先去看看,不过说实话 我并不想签,我想去上海,听说房租挺贵的,不过咱毕竟是刚毕业的毛头小子,先熬呗,总有媳妇熬成婆的一天,我相信!</p>
<p>下载网址:: <a href="http://www.trufun.net">www.trufun.net</a>;</p> <a href="http://hi.baidu.com/handylee/blog/item/73f2753180e32118ebc4af8e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%D0%A1%BC%C7">小记</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/73f2753180e32118ebc4af8e.html#comment">查看评论</a>]]></description>
        <pubDate>2007年05月09日 星期三  22:30</pubDate>
        <category><![CDATA[小记]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/73f2753180e32118ebc4af8e.html</guid>
</item>

<item>
        <title><![CDATA[转 关于23种设计模式的有趣见解]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/17de7a09457825ae2eddd4e5.html]]></link>
        <description><![CDATA[
		
		<p><strong>创建型模式</strong></p>
<p>　　1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory</p>
<p>　　<strong>工厂模式：</strong>客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。</p>
<p>　　2、BUILDER—MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)</p>
<p>　　<strong>建造模式：</strong>将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。</p>
<p>　　3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。</p>
<p>　　<strong>工厂方法模式：</strong>核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。</p>
<p>　　4、PROTOTYPE—跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。(100块钱一份，你要不要)</p>
<p>　　<strong>原始模型模式：</strong>通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。</p>
<p>　　5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事)</p>
<p>　　<strong>单例模式：</strong>单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。</p>
<p>　　<strong>结构型模式</strong></p>
<p>　　6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我)</p>
<p>　　<strong>适配器(变压器)模式：</strong>把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。</p>
<p>　　7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好;碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了</p>
<p>　　<strong>桥梁模式：</strong>将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。</p>
<p>8、COMPOSITE—Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。”“……”，MM都会用Composite模式了，你会了没有?</p>
<p>　　<strong>合成模式：</strong>合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。</p>
<p>　　9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦)，再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗?</p>
<p>　　<strong>装饰模式：</strong>装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。</p>
<p>　　10、FACADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。</p>
<p>　　<strong>门面模式：</strong>外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。</p>
<p>　　11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。</p>
<p>　　<strong>享元模式：</strong>FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。</p>
<p>　　12、PROXY—跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。</p>
<p>　　<strong>代理模式：</strong>代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。</p>
<p>　　<strong>行为模式</strong></p>
<p>　　13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑!</p>
<p>　　<strong>责任链模式：</strong>在责任链模式中，很多对象由每一个对象对其下家的引用而接</p>
<p>　　起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。</p>
<p>　　14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：“我同时给我姐姐三个男朋友送COMMAND，就数你最小气，才请我吃面。”，:-(</p>
<p>　　<strong>命令模式：</strong>命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。</p>
<p>　15、INTERPRETER—俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。</p>
<p>　　<strong>解释器模式：</strong>给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。</p>
<p>　　16、ITERATOR—我爱上了Mary，不顾一切的向她求婚。</p>
<p>　　Mary：“想要我跟你结婚，得答应我的条件”</p>
<p>　　我：“什么条件我都答应，你说吧”</p>
<p>　　Mary：“我看上了那个一克拉的钻石”</p>
<p>　　我：“我买，我买，还有吗?”</p>
<p>　　Mary：“我看上了湖边的那栋别墅”</p>
<p>　　我：“我买，我买，还有吗?”</p>
<p>　　Mary：“你的小弟弟必须要有50cm长”</p>
<p>　　我脑袋嗡的一声，坐在椅子上，一咬牙：“我剪，我剪，还有吗?”</p>
<p>　　……</p>
<p>　　<strong>迭代子模式：</strong>迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集，聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。</p>
<p>　　17、MEDIATOR—四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。</p>
<p>　　<strong>调停者模式：</strong>调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。</p>
<p>　　18、MEMENTO—同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。</p>
<p>　　<strong>备忘录模式：</strong>备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。</p>
<p>　　19、OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者(观察者)就可以及时收到情报啦</p>
<p>　　<strong>观察者模式：</strong>观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。</p>
<p>　　20、STATE—跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会说“有事情啦”，对你不讨厌但还没喜欢上的MM就会说“好啊，不过可以带上我同事么?”，已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。</p>
<p>　　<strong>状态模式：</strong>状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。</p>
<p>　　21、STRATEGY—跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。</p>
<p>　　<strong>策略模式：</strong>策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。</p>
<p>　　22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现);</p>
<p>　　<strong>模板方法模式：</strong>模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。</p>
<p>　　23、VISITOR—情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张卡，这样就轻松多了;</p>
<p>　　<strong>访问者模式：</strong>访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。</p> <a href="http://hi.baidu.com/handylee/blog/item/17de7a09457825ae2eddd4e5.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%B1%E0%B3%CC%BC%BC%CA%F5">编程技术</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/17de7a09457825ae2eddd4e5.html#comment">查看评论</a>]]></description>
        <pubDate>2007年05月06日 星期日  11:39</pubDate>
        <category><![CDATA[编程技术]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/17de7a09457825ae2eddd4e5.html</guid>
</item>

<item>
        <title><![CDATA[超快关机技巧]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/bb38c53d0b465dc69f3d62d8.html]]></link>
        <description><![CDATA[
		
		<p>　　1、Ctrl+Alt+Del<br>
　　2、按住Ctrl不放<br>
　　3、鼠标点击 关机--〉关闭<br>
　　<br>
　　保准你10秒钟内关机,我的机器是5秒内就关了,太快了~</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/bb38c53d0b465dc69f3d62d8.html#comment">查看评论</a>]]></description>
        <pubDate>2007年04月23日 星期一  08:57</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/bb38c53d0b465dc69f3d62d8.html</guid>
</item>

<item>
        <title><![CDATA[轻量级JS库JQuery!]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/afc18e025c1ea80e4bfb5187.html]]></link>
        <description><![CDATA[
		
		<p>说它轻量 其实一点也不轻量,这个库的语法太酷了</p>
<p>极大减少代码编写量,提高代码与页面的分离度.看个例子先</p>
<p>先加入类库</p>
<p>&lt;script src="lib/jquery.js" type="text/javascript"&gt;&lt;/script&gt;</p>
<p>&lt;script&gt;</p>
<p>&nbsp;&nbsp; $(document).ready(function(){</p>
<p>$("#faq").find("dd").hide().end().find("dt").css("cursor","hand").click(function(){<br>
&nbsp;&nbsp;&nbsp;&nbsp; var a = $(this).next();<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (a.is(":visible")) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.slideUp(1000);<br>
&nbsp;&nbsp;&nbsp;&nbsp; }else {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.slideDown(1000);<br>
&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; });</p>
<p>});</p>
<p>&lt;/script&gt;</p>
<p>&lt;div id="faq"&gt;<br>
&lt;dt&gt;问题1&lt;/dt&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;dd&gt;答案1&lt;/dd&gt;</p>
<p>&lt;dt&gt;问题2&lt;/dt&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;dd&gt;答案2&lt;/dd&gt;</p>
<p>&lt;dt&gt;问题3&lt;/dt&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;dd&gt;答案3&lt;/dd&gt;<br>
&lt;/div&gt;</p>
<p> </p>
<p>能看出上边的js代码作了什么工作吗?</p>
<p>没错. 当点击dt元素时 开关下面的答案.slideUp(1000)函数中的1000是1000毫秒 .</p>
<p>代码少吧?再举个例子,大家在很多站点估计都看到过这样的效果,</p>
<p>当输入框获得焦点时候,边框颜色改变加亮,当离开输入框时,边框颜色还原</p>
<p>以前我们可能在每个&lt;input type="text"&gt;里加上 onfocus="this.className='red'" onblur="this.className='blue'" ,是不是很麻烦? 利用Jquery我们可以这样写</p>
<p>$("input[@type=text],textarea").addClass("blue")</p>
<p>.focus(function(){$(this).removeClass("blue");$(this).addClass("red")})</p>
<p>.blur(function(){$(this).remove("red");$(this).addClass("blue")});</p>
<p>这句代码不但所有text类型的input框 甚至包括textarea多文本框都一步实现了这样的效果.</p>
<p>Is it cool enough?</p>
<p>想更多了解JQuery库,去Baidu 或 Google下吧</p>
<p>jQuery Docs - 1.1 API 中文版<a href="http://jquery.org.cn/api/cn/index.xml">http://jquery.org.cn/api/cn/index.xml</a></p> <a href="http://hi.baidu.com/handylee/blog/item/afc18e025c1ea80e4bfb5187.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/web2%2E0%26%2338%3Bjs%26%2338%3Bajax">web2.0&#38;js&#38;ajax</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/afc18e025c1ea80e4bfb5187.html#comment">查看评论</a>]]></description>
        <pubDate>2007年03月17日 星期六  21:57</pubDate>
        <category><![CDATA[web2.0&#38;js&#38;ajax]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/afc18e025c1ea80e4bfb5187.html</guid>
</item>

<item>
        <title><![CDATA[成员名称不能与它们的封闭类型相同]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/0d31b6a110ca788a4610646a.html]]></link>
        <description><![CDATA[
		
		<p>C#中 构造函数</p>
<p>class C1{public C1(){}}正确写法</p>
<p>如果写成 pulic void C1(){} 报错 "成员名称不能与它们的封闭类型相同"</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/0d31b6a110ca788a4610646a.html#comment">查看评论</a>]]></description>
        <pubDate>2007年03月17日 星期六  09:55</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/0d31b6a110ca788a4610646a.html</guid>
</item>

<item>
        <title><![CDATA[C# 实现窗体最小化到托盘]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/8d0c2a971493356c55fb96d4.html]]></link>
        <description><![CDATA[
		
		<p>上网搜了搜 自己改写了下</p>
<p>首先把form的 showtaskBar 设为 false;</p>
<p>再添加notifyIcon控件 notifyIcon1 ，icon属性里改为你要用的图标,visible设为false 因为初始不显示托盘图标,当然你也可以开始就显示</p>
<p>代码里输入</p>
<p>private bool show ;//一个flag</p>
<p> private void Form1_SizeChanged(object sender, EventArgs e)<br>
&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.WindowState == FormWindowState.Minimized) {//判断是否最小化<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Visible = false;//隐藏<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.notifyIcon1.Visible = true;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show = false;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
private void notifyIcon1_DoubleClick(object sender, System.EventArgs e) {<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (!show)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Visible = true;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.WindowState = FormWindowState.Normal;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show = true;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (show) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Visible = false;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.WindowState = FormWindowState.Minimized;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show = false;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
}</p>
<p> </p>
<p>基本就是这样.</p> <a href="http://hi.baidu.com/handylee/blog/item/8d0c2a971493356c55fb96d4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/8d0c2a971493356c55fb96d4.html#comment">查看评论</a>]]></description>
        <pubDate>2007年03月16日 星期五  09:39</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/8d0c2a971493356c55fb96d4.html</guid>
</item>

<item>
        <title><![CDATA[zt 解决 FireFox 下[event] 的问题.]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/9d059b0ad031dd1f95ca6bd6.html]]></link>
        <description><![CDATA[
		
		<div class="postTitle">在FireFox下编写事件处理函数是很麻烦的事.<br>
因为FireFox并没有&nbsp;window.event&nbsp;.&nbsp;如果要得到&nbsp;event&nbsp;对象,就必须要声明时间处理函数的第一个参数为event.<br>
<br>
所以为了兼容IE与FireFox,一般的事件处理方法为:<br>
btn.onclick=handle_btn_click;<br>
function&nbsp;handle_btn_click(evt)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(evt==null)evt=window.event;//IE<br>
&nbsp;&nbsp;&nbsp;&nbsp;//处理事件.<br>
}<br>
对于简单的程序,这不算麻烦.<br>
<br>
但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.<br>
<br>
下面介绍一个解决这个麻烦事的方法,与原理.<br>
<br>
<strong>JScript中，函数的调用是有一个&nbsp;func.caller&nbsp;这个属性的.</strong><br>
例如&nbsp;<br>
function&nbsp;A()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;B();<br>
}<br>
function&nbsp;B()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;alert(B.caller);<br>
}<br>
如果B被A调用,那么B.caller就是A<br>
<br>
<strong>另外,函数有一个arguments属性.&nbsp;这个属性可以遍历函数当前执行的参数:</strong><br>
function&nbsp;myalert()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;arr=[];<br>
&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i=0;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr[i]=myalert.arguments[i];<br>
&nbsp;&nbsp;&nbsp;&nbsp;alert(arr.join("-"));<br>
}<br>
alert("hello","world",1,2,3)<br>
就能显示&nbsp;hello-world-1-2-3<br>
(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)<br>
<br>
<strong>根据这两个属性,我们可以得到第一个函数的event对象:</strong><br>
btn.onclick=handle_click;<br>
function&nbsp;handle_click()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;showcontent();<br>
}<br>
function&nbsp;showcontent()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;evt=SearchEvent();<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(evt&amp;&amp;evt.shiftKey)//如果是基于事件的调用,并且shift被按下<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.open(global_helpurl);<br>
&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location.href=global_helpurl;<br>
}<br>
function&nbsp;SearchEvent()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;func=SearchEvent.caller;<br>
&nbsp;&nbsp;&nbsp;&nbsp;while(func!=null)<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;arg0=func.arguments[0];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(arg0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(arg0.constructor==Event)&nbsp;//&nbsp;如果就是event&nbsp;对象<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;arg0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func=func.caller;<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;<br>
}<br>
这个例子使用了SearchEvent来搜索event对象.&nbsp;其中&nbsp;'Event'&nbsp;是&nbsp;FireFox&nbsp;的&nbsp;event.constructor&nbsp;.<br>
在该例子运行时,<br>
SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以&nbsp;func=func.caller&nbsp;时,func变为handle_click&nbsp;.<br>
handle_click&nbsp;被&nbsp;FireFox&nbsp;调用,&nbsp;虽然没有定义参数,但是被调用时,第一个参数就是event,所以handle_click.arguments[0]就是event&nbsp;!<br>
<br>
<strong>针对上面的知识,我们可以结合&nbsp;prototype.__defineGetter__&nbsp;来实现&nbsp;window.event&nbsp;在&nbsp;FireFox&nbsp;下的实现:</strong><br>
<br>
下面给出一个简单的代码..&nbsp;有兴趣的可以补充<br>
<br>
 if(window.addEventListener)
{
FixPrototypeForGecko();
}
function&nbsp;FixPrototypeForGecko()
{
HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);
window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);
Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);
}
function&nbsp;element_prototype_get_runtimeStyle()
{
//return&nbsp;style&nbsp;instead...
return&nbsp;this.style;
}
function&nbsp;window_prototype_get_event()
{
return&nbsp;SearchEvent();
}
function&nbsp;event_prototype_get_srcElement()
{
return&nbsp;this.target;
}

function&nbsp;SearchEvent()
{
//IE
if(document.all)
 return&nbsp;window.event;
func=SearchEvent.caller;
while(func!=null)
{
 var&nbsp;arg0=func.arguments[0];
 if(arg0)
 {
  if(arg0.constructor==Event)
   return&nbsp;arg0;
 }
 func=func.caller;
}
return&nbsp;null;
}
&lt;/body&gt;&lt;/html&gt; </div> <a href="http://hi.baidu.com/handylee/blog/item/9d059b0ad031dd1f95ca6bd6.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/web2%2E0%26%2338%3Bjs%26%2338%3Bajax">web2.0&#38;js&#38;ajax</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/9d059b0ad031dd1f95ca6bd6.html#comment">查看评论</a>]]></description>
        <pubDate>2007年03月08日 星期四  13:25</pubDate>
        <category><![CDATA[web2.0&#38;js&#38;ajax]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/9d059b0ad031dd1f95ca6bd6.html</guid>
</item>

<item>
        <title><![CDATA[转 跨越边界: JavaScript 语言特性]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/e89952df71340f13495403dc.html]]></link>
        <description><![CDATA[
		
		<blockquote>
<p>JavaScript&nbsp;常被人们认为是编程语言中无足轻重的一员。这种观点的形成可以“归功”于其开发工具、复杂且不一致的面向&nbsp;HTML&nbsp;页面的文档对象模型以及不一致的浏览器实现。但&nbsp;JavaScript&nbsp;绝对不仅仅是一个玩具这么简单。在本文中，Bruce&nbsp;Tate&nbsp;向您介绍了&nbsp;JavaScript&nbsp;的语言特性。&nbsp;几乎每个&nbsp;Web&nbsp;开发人员都曾有过诅咒&nbsp;JavaScript&nbsp;的经历。这个备受争议的语言受累于其复杂的称为文档对象模型&nbsp;(DOM)的编程模型、糟糕的实现和调试工具以及不一致的浏览器实现。直到最近，很多开发人员还认为&nbsp;Javascript&nbsp;从最好的方面说是无可避免之灾祸，从最坏的方面说不过是一种玩具罢了。&nbsp;</p>
</blockquote>
<p>然而&nbsp;JavaScript&nbsp;现在开始日益重要起来，而且成为了广泛应用于&nbsp;Web&nbsp;开发的脚本语言。JavaScript&nbsp;的复苏使一些业界领袖人物也不得不开始重新审视这种编程语言。诸如&nbsp;Ajax&nbsp;(Asynchronous&nbsp;JavaScript&nbsp;+&nbsp;XML)&nbsp;这样的编程技术让&nbsp;Web&nbsp;网页更加迷人。而完整的&nbsp;Web&nbsp;开发框架，比如&nbsp;Apache&nbsp;Cocoon，则让&nbsp;JavaScript&nbsp;的应用越来越多，使其不只限于是一种用于制作&nbsp;Web&nbsp;页面的简单脚本。JavaScript&nbsp;的一种称为&nbsp;ActionScript&nbsp;的派生物也推动了&nbsp;Macromedia&nbsp;的&nbsp;Flash&nbsp;客户端框架的发展。运行在&nbsp;JVM&nbsp;上的实现&nbsp;Rhino&nbsp;让&nbsp;JavaScript&nbsp;成为了&nbsp;Java&#8482;&nbsp;开发人员所首选的一类脚本语言（参见&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#resources"><font color="#996699">参考资料</font></a>）。&nbsp;</p>
<p>我的好友兼同事&nbsp;Stuart&nbsp;Halloway&nbsp;是&nbsp;Ajax&nbsp;方面的专家，曾在其教授的&nbsp;JavaScript&nbsp;课程中做过这样的开场白：“到&nbsp;2011&nbsp;年，JavaScript&nbsp;将被公认为是一种拥有开发现代应用程序所需的一整套新特性的语言”&nbsp;。他继而介绍说&nbsp;JavaScript&nbsp;程序要比类似的&nbsp;Java&nbsp;程序紧密十倍，并继续展示了使其之所以如此的一些语言特性。&nbsp;</p>
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
<tbody>
    <tr>
        <td width="10"><img height="1" width="10" src="http://www.ibm.com/i/c.gif"></td>
        <td>
<table cellspacing="0" cellpadding="5" width="100%" border="1">
        <tbody>
            <tr>
                <td bgcolor="#eeeeee"><a name="N1007A"><strong><font color="#000000">关于这个系列</font></strong></a><br>
                <p>在&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb/"><font color="#5c81a7">跨越边界系列中</font></a>，作者&nbsp;Bruce&nbsp;Tate&nbsp;提出了这样一个主张：今天的&nbsp;Java&nbsp;程序员通过学习其他技术和语言，会得到很好的帮助。编程领域已经发生了变化，Java&nbsp;技术不再是所有开发项目理所当然的最佳选择。其他框架正在影响&nbsp;Java&nbsp;框架构建的方式，而从其他语言学到的概念也有助于&nbsp;Java&nbsp;编程。对&nbsp;Python（或&nbsp;Ruby、Smalltalk&nbsp;等等）代码的编写可能改变&nbsp;Java&nbsp;编码的方式。</p>
                <p>这个系列介绍的编程概念和技术，与&nbsp;Java&nbsp;开发有根本的不同，但可以直接应用于&nbsp;Java&nbsp;编程。在某些情况下，需要集成这些技术来利用它们。在其他情况下，可以直接应用这些概念。单独的工具并不重要，重要的是其他语言和框架可以影响&nbsp;Java&nbsp;社区中的开发人员、框架，甚至是基本方式。&nbsp;</p>
</td>
            </tr>
        </tbody>
    </table>
</td>
</tr>
</tbody>
</table>
<p>在这篇文章中，我将带您探究&nbsp;JavaScript&nbsp;的一些特性，看看这些特性如何让它如此具有吸引力：&nbsp;</p>
<ul>
<li><strong>高阶函数：</strong>&nbsp;一个高阶函数可以将函数作为参数，也可以返回一个函数。此特性让&nbsp;JavaScript&nbsp;程序员可以用&nbsp;Java&nbsp;语言所不能提供的方法来操纵函数。<br>
<br>
</li>
    <li><strong>动态类型：</strong>通过延迟绑定，JavaScript&nbsp;可以更准确和更灵活。<br>
<br>
</li>
    <li><strong>灵活的对象模型：</strong>JavaScript&nbsp;的对象模型使用一种相对不常见的方式进行继承&nbsp;——&nbsp;称为<em>原型</em>&nbsp;——&nbsp;而不是&nbsp;Java&nbsp;语言中更常见的基于类的对象模型。&nbsp;&nbsp;</li>
</ul>
    <p>您可能已经熟悉动态类型模型、高阶函数形式的函数式编程以及开放对象模型这些概念，因为我在其他的<em>跨越边界</em>&nbsp;系列文章中已经作过相关的介绍。如果您从未进行过任何正式的&nbsp;JavaScript&nbsp;开发，您很可能会认为这些特性属于非常复杂的语言，例如&nbsp;Python、Lisp、Smalltalk&nbsp;和&nbsp;Haskell，而绝非像&nbsp;JavaScript&nbsp;这样的语言所能提供的。因此，我将用实际的代码示例来说明这些概念。&nbsp;</p>
    <p><a name="N100B4"><span class="atitle"><font color="#000000">立即开始</font></span></a></p>
    <p>您无需设置&nbsp;JavaScript。如果您可以在浏览器中阅读此篇文章，就证明您已经准备就绪了。本文包含的所有编程示例都可以在大多数浏览器内运行。我使用的是&nbsp;Firefox。&nbsp;</p>
    <p>用在&nbsp;<code><font face="新宋体">&lt;script&nbsp;type='text/javascript'&gt;</font></code>&nbsp;和&nbsp;<code><font face="新宋体">&lt;/script&gt;</font></code>&nbsp;标记之间所包含的&nbsp;JavaScript&nbsp;加载简单的&nbsp;Web&nbsp;页面。清单&nbsp;1&nbsp;可以显示&nbsp;Hello,&nbsp;World&nbsp;文本：&nbsp;</p>
<br>
<br>
<a name="N100CC"><strong><font color="#000000">清单&nbsp;1.&nbsp;Hello,&nbsp;world</font></strong></a><br>
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
<pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;script&nbsp;type='text/javascript'&gt;
alert('Hello,&nbsp;World.')
&lt;/script&gt;
</pre>
</td>
        </tr>
    </tbody>
</table>
<br>
<p>要运行此代码，只需创建一个名为&nbsp;example1.html&nbsp;的文件。将清单&nbsp;1&nbsp;的代码复制到该文件内，并在浏览器中加载此文件（参看&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#download"><font color="#996699">下载</font></a>&nbsp;部分以获得本文使用的所有示例&nbsp;HTML&nbsp;文件）。注意到每次重载此页面时，该代码都会立即执行。</p>
<p><code><font face="新宋体">alert</font></code>&nbsp;是个函数调用，只有一个字符串作为参数。图&nbsp;1&nbsp;显示了由清单&nbsp;1&nbsp;中的代码弹出的警告框，显示文本&nbsp;“Hello,&nbsp;World”。如果代码在&nbsp;HTML&nbsp;body&nbsp;之内（目前并未指定任何&nbsp;body，但浏览器能接受不规则的&nbsp;HTML，并且整个页面都默然作为一个&nbsp;body&nbsp;被处理）。页面一旦加载，JavaScript&nbsp;就会立即执行。&nbsp;</p>
<br>
<br>
<a name="figure1"><strong><font color="#000000">图&nbsp;1.&nbsp;Hello,&nbsp;world</font></strong></a><br>
<img height="136" alt="Hello, World." width="320" src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-1.jpg">&nbsp;<br>
<p>如果要延迟执行，可以在&nbsp;HTML&nbsp;<code><font face="新宋体">&lt;head&gt;</font></code>&nbsp;元素声明&nbsp;JavaScript&nbsp;函数，如清单&nbsp;2&nbsp;所示：&nbsp;</p>
<br>
<br>
<a name="listing2"><strong><font color="#000000">清单&nbsp;2.&nbsp;延迟执行</font></strong></a><br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td class="code-outline">
<pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type='text/javascript'&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;hello()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Hello,&nbsp;World.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="hello();"&gt;Say&nbsp;Hello&lt;/button&gt;
&lt;/body&gt;
</pre>
</td>
    </tr>
</tbody>
</table>
<br>
<p>将清单&nbsp;2&nbsp;中的代码输入到一个&nbsp;HTML&nbsp;文件，在浏览器内加载该文件，单击&nbsp;<strong>Say&nbsp;Hello</strong>&nbsp;按钮，结果如图&nbsp;2&nbsp;所示：</p>
<br>
<br>
<a name="figure2"><strong><font color="#000000">图&nbsp;2.&nbsp;延迟执行</font></strong></a><br>
<img height="262" alt="延迟执行" width="397" src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-2.jpg">&nbsp;<br>
<br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td><img height="1" width="100%" src="http://www.ibm.com/i/v14/rules/blue_rule.gif"><br>
<img height="6" width="8" border="0" src="http://www.ibm.com/i/c.gif"></td>
    </tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
<tbody>
    <tr align="right">
    <td><img height="4" width="100%" src="http://www.ibm.com/i/c.gif"><br>
    <table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td valign="middle"><img height="16" width="16" border="0" src="http://www.ibm.com/i/v14/icons/u_bold.gif"><br>
</td>
            <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main"><strong><font color="#996699">回页首</font></strong></a></td>
        </tr>
    </tbody>
</table>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<p><a name="N10117"><span class="atitle"><font color="#000000">高阶函数</font></span></a></p>
<p>从&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#listing2"><font color="#996699">清单&nbsp;2</font></a>，可以大致体会到一些&nbsp;JavaScript&nbsp;在操纵函数方面的能力。将函数名称传递给&nbsp;HTML&nbsp;<code><font face="新宋体">button</font></code>&nbsp;标记并利用&nbsp;HTML&nbsp;的内置事件模型。使用&nbsp;JavaScript&nbsp;时，我会经常在变量或数组中存储函数（在本文后面的&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#objectmodels"><font color="#996699">对象模型</font></a>&nbsp;一节，您会看到&nbsp;JavaScript&nbsp;对象模型策略大量使用了此技巧）。例如，查看一下清单&nbsp;3：&nbsp;</p>
<br>
<br>
<a name="listing3"><strong><font color="#000000">清单&nbsp;3.&nbsp;用变量操纵函数</font></strong></a><br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td class="code-outline">
<pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type='text/javascript'&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hot&nbsp;=&nbsp;function&nbsp;hot()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Sweat.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cold&nbsp;&nbsp;=&nbsp;function&nbsp;cold()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Shiver.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;swap()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;hot
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hot&nbsp;=&nbsp;cold
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cold&nbsp;=&nbsp;temp&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Swapped.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="hot();"&gt;Hot&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="cold();"&gt;Cold&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="swap();"&gt;Swap&lt;/button&gt;
&lt;/body&gt;
</pre>
</td>
    </tr>
</tbody>
</table>
<br>
<p>函数是&nbsp;JavaScript&nbsp;中的一类对象，可以自由地操纵它们。首先我声明两个函数：<code><font face="新宋体">hot</font></code>&nbsp;和&nbsp;<code><font face="新宋体">cold</font></code>。并分别在不同的变量存储它们。单击&nbsp;Hot&nbsp;或&nbsp;Cold&nbsp;按钮会调用对应的函数，生成一个告警。接下来，声明另一个函数用来交换&nbsp;Hot&nbsp;和&nbsp;Cold&nbsp;按钮的值，将此函数与第三个按钮关联，该按钮显示如图&nbsp;3&nbsp;所示的告警：&nbsp;</p>
<br>
<br>
<a name="figure3"><strong><font color="#000000">图&nbsp;3.&nbsp;操纵函数</font></strong></a><br>
<img height="172" width="465" src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-3.jpg">&nbsp;<br>
<p>这个例子说明可以像处理其他变量一样处理函数。C&nbsp;开发人员很容易将此概念看作是<em>函数指针</em>&nbsp;功能，但&nbsp;JavaScript&nbsp;的高阶函数的功能更为强大。该特性让&nbsp;JavaScript&nbsp;程序员能够像处理其他变量类型一样轻松处理动作或函数。</p>
<p>将函数用作函数的参数，或将函数作为值返回，这些概念属于高阶函数的领域。清单&nbsp;4&nbsp;对&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#listing3"><font color="#996699">清单&nbsp;3</font></a>&nbsp;做了一点点修改，显示了能返回函数的高阶函数：</p>
<br>
<br>
<a name="N10162"><strong><font color="#000000">清单&nbsp;4.&nbsp;高阶函数</font></strong></a><br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td class="code-outline">
<pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;head&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type='text/javascript'&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;temperature()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;current
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hot&nbsp;=&nbsp;function&nbsp;hot()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Hot.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cold&nbsp;&nbsp;=&nbsp;function&nbsp;cold()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Cold.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;hot

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;swap()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(current&nbsp;==&nbsp;hot)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;cold
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;hot
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="funct&nbsp;=&nbsp;temperature()();"&gt;Temperature&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="swap();"&gt;Swap&lt;/button&gt;
&lt;/body&gt;
</pre>
</td>
    </tr>
</tbody>
</table>
<br>
<p>这个例子解决了一个常见问题：如何将更改中的行为附加到用户接口事件？通过高阶函数，这很容易做到。<code><font face="新宋体">temperature</font></code>&nbsp;高阶函数返回&nbsp;<code><font face="新宋体">current</font></code>&nbsp;的值，而&nbsp;current&nbsp;又可以有&nbsp;<code><font face="新宋体">hot</font></code>&nbsp;或&nbsp;<code><font face="新宋体">cold</font></code>&nbsp;函数。看一下这个有些陈旧的函数调用：<code><font face="新宋体">temperature()()</font></code>。第一组括号用于调用&nbsp;<code><font face="新宋体">temperature</font></code>&nbsp;函数。第二组括号调用由&nbsp;<code><font face="新宋体">temperature</font></code>&nbsp;<em>返回</em>&nbsp;的函数。图&nbsp;4&nbsp;显示了输出：</p>
<br>
<br>
<a name="figure4"><strong><font color="#000000">图&nbsp;4.&nbsp;高阶函数</font></strong></a><br>
<img height="193" alt="高阶函数" width="500" src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-4.jpg">&nbsp;<br>
<p>高阶函数是函数式编程的基础，对比面向对象编程，函数式编程代表了更高级别的抽象。但&nbsp;JavaScript&nbsp;的实力并不仅限于高阶函数。JavaScript&nbsp;的动态类型就极为适合&nbsp;UI&nbsp;开发。</p>
<br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td><img height="1" width="100%" src="http://www.ibm.com/i/v14/rules/blue_rule.gif"><br>
<img height="6" width="8" border="0" src="http://www.ibm.com/i/c.gif"></td>
    </tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
<tbody>
    <tr align="right">
    <td><img height="4" width="100%" src="http://www.ibm.com/i/c.gif"><br>
    <table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td valign="middle"><img height="16" width="16" border="0" src="http://www.ibm.com/i/v14/icons/u_bold.gif"><br>
</td>
            <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main"><strong><font color="#996699">回页首</font></strong></a></td>
        </tr>
    </tbody>
</table>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<p><a name="N1019D"><span class="atitle"><font color="#000000">动态类型</font></span></a></p>
<p>通过静态类型，编译器可以检查参数和变量的值或针对一个给定操作所允许的返回值。其优势是编译器可以做额外的错误检查。而且静态类型还可以为诸如&nbsp;IDE&nbsp;这样的工具提供更多信息，带来其他一些特性，比如更好的代码完成功能。但静态类型也存在着如下一些劣势：</p>
<ul>
<li>必须提前声明意图，这常常会导致灵活性降低。例如，更改一个&nbsp;Java&nbsp;类就会更改类的类型，因而必须重新编译。对比之下，Ruby&nbsp;允许开放的类，但更改一个&nbsp;Java&nbsp;类还是会更改类的类型。<br>
<br>
</li>
    <li>要实现相同的功能，必须输入更多的代码。例如，必须用参数形式包括进类型信息，必须用函数形式返回值和所有变量的类型。另外，还必须声明所有变量并显式地转化类型。<br>
<br>
</li>
    <li>静态语言的编译-部署周期要比动态语言的部署周期长，尽管一些工具可被用来在某种程度上缓解这一问题。&nbsp;&nbsp;</li>
</ul>
    <p>静态类型更适合用于构建中间件或操作系统的语言中。UI&nbsp;开发常常需要更高的效率和灵活性，所以更适合采用动态类型。我深知这种做法存在危险。相信使用过&nbsp;JavaScript&nbsp;的&nbsp;Web&nbsp;开发人员都曾经为编译器本应检测到的错误类型的变量而绞尽脑汁。但它所带来的优势同样不可否认。下面将举例加以说明。</p>
    <p>首先，考虑一个对象的情况。在清单&nbsp;5&nbsp;中，创建一个新对象，并访问一个不存在的属性，名为&nbsp;<code><font face="新宋体">color</font></code>：</p>
<br>
<br>
<a name="listing5"><strong><font color="#000000">清单&nbsp;5.&nbsp;引入一个属性</font></strong></a><br>
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
<pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;script&nbsp;type='text/javascript'&gt;
&nbsp;&nbsp;&nbsp;&nbsp;blank_object&nbsp;=&nbsp;new&nbsp;Object();
&nbsp;&nbsp;&nbsp;&nbsp;blank_object.color&nbsp;=&nbsp;'blue'
&nbsp;&nbsp;&nbsp;&nbsp;alert('The&nbsp;color&nbsp;is&nbsp;'&nbsp;+&nbsp;blank_object.color)
&lt;/script&gt;
</pre>
</td>
        </tr>
    </tbody>
</table>
<br>
<p>当加载并执行此应用程序时，会得到如图&nbsp;5&nbsp;所示的结果：</p>
<br>
<br>
<a name="figure5"><strong><font color="#000000">图&nbsp;5.&nbsp;引入属性</font></strong></a><br>
<img height="136" alt="引入属性" width="320" src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-5.jpg">&nbsp;<br>
<p>JavaScript&nbsp;并不会报告&nbsp;<code><font face="新宋体">blue</font></code>&nbsp;属性不存在的错误。静态类型的拥护者大都会被本例所吓倒，因为本例中的错误被很好地隐匿了。虽然这种做法多少会让您感觉有些不正当，但您也不能否认它巨大的诱惑力。您可以很快引入属性。如果将本例和本文之前的例子结合起来，还可以引入行为。记住，变量可以保存函数！所以，基于动态类型和高阶函数，您可以在任何时候向类中引入任意的行为。&nbsp;</p>
<p>可以轻松地重写&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#listing5"><font color="#996699">清单&nbsp;5</font></a>，使其如清单&nbsp;6&nbsp;所示：</p>
<br>
<br>
<a name="N101F3"><strong><font color="#000000">清单&nbsp;6.&nbsp;引入行为</font></strong></a><br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td class="code-outline">
<pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;script&nbsp;type='text/javascript'&gt;
&nbsp;&nbsp;&nbsp;&nbsp;blank_object&nbsp;=&nbsp;new&nbsp;Object();
&nbsp;&nbsp;&nbsp;&nbsp;blank_object.color&nbsp;=&nbsp;function()&nbsp;{&nbsp;return&nbsp;'blue'}
&nbsp;&nbsp;&nbsp;&nbsp;alert('The&nbsp;color&nbsp;is&nbsp;'&nbsp;+&nbsp;blank_object.color())
&lt;/script&gt;
</pre>
</td>
    </tr>
</tbody>
</table>
<br>
<p>从上例可以看出，在&nbsp;JavaScript&nbsp;的不同概念之间可以如此轻松地来回变换，其含义上的变化很大&nbsp;——&nbsp;比如，是引入行为还是引入数据&nbsp;——&nbsp;但语法上的变化却很小。该语言很好的延展性是它的一种优势，但同样也是其缺点所在。实际上，该语言本身的对象模型就是&nbsp;JavaScript&nbsp;延展程度的一种体现。</p>
<br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td><img height="1" width="100%" src="http://www.ibm.com/i/v14/rules/blue_rule.gif"><br>
<img height="6" width="8" border="0" src="http://www.ibm.com/i/c.gif"></td>
    </tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
<tbody>
    <tr align="right">
    <td><img height="4" width="100%" src="http://www.ibm.com/i/c.gif"><br>
    <table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td valign="middle"><img height="16" width="16" border="0" src="http://www.ibm.com/i/v14/icons/u_bold.gif"><br>
</td>
            <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main"><strong><font color="#996699">回页首</font></strong></a></td>
        </tr>
    </tbody>
</table>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<p><a name="objectmodels"><span class="atitle"><font color="#000000">对象模型</font></span></a></p>
<p>到目前为止，您应该对&nbsp;JavaScript&nbsp;有一个正确的评价了，它绝非只如一个玩具那么简单。事实上，很多人都使用过其对象模型创建过极为复杂、设计良好的面向对象软件。但对象模型尤其是用于继承的对象模型又非您一贯认为的那样。&nbsp;</p>
<p>Java&nbsp;语言是基于类的。当构建应用程序时，也同时构建了可以作为所有对象的模板的新类。然后调用&nbsp;<code><font face="新宋体">new</font></code>&nbsp;来实例化该模板，创建一个新对象。而在&nbsp;JavaScript&nbsp;中，所创建的是一个原型，此原型是一个实例，可以创建所有未来的对象。&nbsp;</p>
<p>现在先暂且放下这些抽象的概念，去查看一些实际代码。比如，清单&nbsp;7&nbsp;创建了一个简单的&nbsp;<code><font face="新宋体">Animal</font></code>，它具有&nbsp;<code><font face="新宋体">name</font></code>&nbsp;属性和&nbsp;<code><font face="新宋体">speak</font></code>&nbsp;动作。其他动物会从这个基础继承。&nbsp;</p>
<br>
<br>
<a name="listing7"><strong><font color="#000000">清单&nbsp;7.&nbsp;创建一个构造函数</font></strong></a><br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td class="code-outline">
<pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;script&nbsp;type='text/javascript'&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Animal&nbsp;=&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;"nobody"
&nbsp;&nbsp;&nbsp;&nbsp;this.speak&nbsp;=&nbsp;function&nbsp;()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Who&nbsp;am&nbsp;I?"
&nbsp;&nbsp;&nbsp;&nbsp;}
}

myAnimal&nbsp;=&nbsp;new&nbsp;Animal();
alert('The&nbsp;animal&nbsp;named&nbsp;'&nbsp;+&nbsp;myAnimal.name&nbsp;+&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;says&nbsp;'&nbsp;+&nbsp;myAnimal.speak());

&lt;/script&gt;
</pre>
</td>
    </tr>
</tbody>
</table>
<br>
<p>清单&nbsp;7&nbsp;的结果如图&nbsp;6&nbsp;所示：</p>
<br>
<br>
<a name="figure6"><strong><font color="#000000">图&nbsp;6.&nbsp;创建一个构造函数</font></strong></a><br>
<img height="135" alt="构造函数" width="383" src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-6.jpg">&nbsp;<br>
<p>对于&nbsp;Java&nbsp;开发人员而言，清单&nbsp;7&nbsp;中的代码看起来多少有点生疏和奇怪。实际上对于没有亲自构建过对象的许多&nbsp;JavaScript&nbsp;开发人员来说，这些代码同样看起来有点生疏和奇怪。也许，下面的解释可以让大家能够更好地理解这段代码。&nbsp;</p>
<p>实际上，您只需重点关注其中三段信息。首先，JavaScript&nbsp;用嵌套函数表示对象。这意味着清单&nbsp;7&nbsp;中的&nbsp;<code><font face="新宋体">Animal</font></code>&nbsp;的定义是一种有效的语法。第二，JavaScript&nbsp;基于原型或现有的对象的实例来构造对象，而非基于类模板。<code><font face="新宋体">funct()</font></code>&nbsp;是一种调用，但&nbsp;<code><font face="新宋体">new&nbsp;Animal()</font></code>&nbsp;却基于&nbsp;<code><font face="新宋体">Animal</font></code>&nbsp;内的原型构造一个对象。最后，在&nbsp;JavaScript&nbsp;中，对象只是函数和变量的集合。每个对象并不与类型相关，所以可以自由地修改这种结构。&nbsp;</p>
<p>回到&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#listing7"><font color="#996699">清单&nbsp;7</font></a>。如您所见，JavaScript&nbsp;基于在&nbsp;<code><font face="新宋体">Animal</font></code>&nbsp;中指定的原型定义一个新对象：<code><font face="新宋体">myAnimal</font></code>。继而可以使用原型中的属性和函数，甚或重定义函数和属性。这种灵活性可能会让&nbsp;Java&nbsp;开发人员受不了，因为他们不习惯这种行为，但它的确是一种十分强大的模型。</p>
<p>现在我还要更深入一步。您还可以使用名为&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;实例变量来指定对象的基础。方法是设置&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;实例变量使其指向继承链的父。如此设置&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;之后，您所创建的对象会为未指定的那些对象继承属性和函数。这样一来，您就可以模仿面向对象的继承概念。以清单&nbsp;8&nbsp;为例：&nbsp;</p>
<br>
<br>
<a name="N10271"><strong><font color="#000000">清单&nbsp;8.&nbsp;通过原型继承</font></strong></a><br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td class="code-outline">
<pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;script&nbsp;type='text/javascript'&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Animal&nbsp;=&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;"nobody"
&nbsp;&nbsp;&nbsp;&nbsp;this.speak&nbsp;=&nbsp;function&nbsp;()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Who&nbsp;am&nbsp;I?"
&nbsp;&nbsp;&nbsp;&nbsp;}
}
Dog&nbsp;=&nbsp;function()&nbsp;{
&nbsp;&nbsp;this.speak&nbsp;=&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Woof!"
&nbsp;&nbsp;}
}
Dog.prototype&nbsp;=&nbsp;new&nbsp;Animal();

myAnimal&nbsp;=&nbsp;new&nbsp;Dog();
alert('The&nbsp;animal&nbsp;named&nbsp;'&nbsp;+&nbsp;myAnimal.name&nbsp;+&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;says&nbsp;'&nbsp;+&nbsp;myAnimal.speak());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;
</pre>
</td>
    </tr>
</tbody>
</table>
<br>
<p>在清单&nbsp;8&nbsp;中，创建了一个&nbsp;<code><font face="新宋体">Dog</font></code>&nbsp;原型。此原型基于&nbsp;<code><font face="新宋体">Animal</font></code>。<code><font face="新宋体">Dog</font></code>&nbsp;重定义&nbsp;<code><font face="新宋体">speak()</font></code>&nbsp;方法但却不会对&nbsp;<code><font face="新宋体">name()</font></code>&nbsp;方法做任何改动。随后，将原型&nbsp;<code><font face="新宋体">Dog</font></code>&nbsp;设置成&nbsp;<code><font face="新宋体">Animal</font></code>。图&nbsp;7&nbsp;显示了其结果：</p>
<br>
<br>
<a name="figure7"><strong><font color="#000000">图&nbsp;7.&nbsp;通过原型继承</font></strong></a><br>
<img height="135" alt="继承" width="355" src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-7.jpg">&nbsp;<br>
<p>这也展示了&nbsp;JavaScript&nbsp;是如何解决到属性或方法的引用问题的：</p>
<ul>
<li>JavaScript&nbsp;基于原始的原型创建实例，该原型在构造函数中定义。任何对方法或属性的引用都会使用所生成的原始副本。<br>
<br>
</li>
    <li>您可以在对象内像定义其他任何变量一样重新定义这些变量。这样做必然会更改此对象。所以您显式定义的任何属性或函数都将比在原始的原型中定义的那些属性或函数优先级要高。<br>
<br>
</li>
    <li>如果您显式设置了名为&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;的实例变量，JavaScript&nbsp;就会在此实例中寻找任何未定义的实例变量或属性。这种查找是递归的：如果&nbsp;在&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;内定义的实例不能找到属性或函数，它就会在<em>其</em>&nbsp;原型中查找，依此类推。&nbsp;&nbsp;</li>
</ul>
    <p>那么，JavaScript&nbsp;的继承模型到底是什么样的？这取决于您如何对它进行定义。您需要定义继承行为以便可以覆盖它。然而，从本质上讲，JavaScript&nbsp;更像是一种函数式语言，而非面向对象的语言，它使用一些智能的语法和语义来仿真高度复杂的行为。其对象模型极为灵活、开放和强大，具有全部的反射性。有些人可能会说它太过灵活。而我的忠告则是，按具体作业的需要选择合适的工具。</p>
<br>
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" width="100%" src="http://www.ibm.com/i/v14/rules/blue_rule.gif"><br>
<img height="6" width="8" border="0" src="http://www.ibm.com/i/c.gif"></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
<tbody>
    <tr align="right">
    <td><img height="4" width="100%" src="http://www.ibm.com/i/c.gif"><br>
    <table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td valign="middle"><img height="16" width="16" border="0" src="http://www.ibm.com/i/v14/icons/u_bold.gif"><br>
</td>
            <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main"><strong><font color="#996699">回页首</font></strong></a></td>
        </tr>
    </tbody>
</table>
</td>
</tr>
</tbody>
</table>
<br>
<br>
<p><a name="N102CB"><span class="atitle"><font color="#000000">结束语</font></span></a></p>
<p>JavaScript&nbsp;对象模型构建在该语言的其他功能之上来支持大量的库，比如&nbsp;Dojo（参见&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#resources"><font color="#996699">参考资料</font></a>）。这种灵活性让每个框架能够以一种精细的方式更改对象模型。在某种程度上，这种灵活性是一种极大的缺点。它可以导致可怕的互操作性问题（尽管该语言的灵活性可以部分缓解这些问题）。&nbsp;</p>
<p>而另一方面，灵活性又是一种巨大的优势。Java&nbsp;语言一直苦于无法充分增强其灵活性，原因是它的基本对象模型还未灵活到可以被扩展的程度。一个典型的企业级开发人员为能够成功使用&nbsp;Java&nbsp;语言必须要学习很多东西，而新出现的一些优秀的开放源码项目和新技术，比如面向方面编程、Spring&nbsp;编程框架和字节码增强库，则带来了大量要学的代码。&nbsp;</p>
<p>最后，JavaScript&nbsp;优秀的灵活性的确让您体会到了一些高阶语言的强大功能。当然您无需选择为每个项目或大多数项目都做这样的权衡和折衷。但了解一种语言的优势和劣势&nbsp;——&nbsp;通过参考大量信息，而不仅仅基于广告宣传或公众意见&nbsp;——&nbsp;会让您可以更好地控制何时需要使用以及何时不能使用这种语言。当您在修改&nbsp;JavaScript&nbsp;Web&nbsp;小部件时，您至少知道该如何让此语言发挥它最大的优势。请继续跨越边界吧。</p>
<br>
<br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
    <tr>
        <td><img height="1" width="100%" src="http://www.ibm.com/i/v14/rules/blue_rule.gif"><br>
<img height="6" width="8" border="0" src="http://www.ibm.com/i/c.gif"></td>
    </tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
<tbody>
    <tr align="right">
    <td><img height="4" width="100%" src="http://www.ibm.com/i/c.gif"><br>
    <table cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td valign="middle"><img height="16" width="16" border="0" src="http://www.ibm.com/i/v14/icons/u_bold.gif"><br>
</td>
            <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main"><strong><font color="#996699">回页首</font></strong></a></td>
        </tr>
    </tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>转自IBM<a target="_blank" href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html">developerWorks&nbsp;</a>&nbsp;&nbsp;&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#author"><font color="#996699">Bruce&nbsp;Tate</font></a>&nbsp;(<a href="mailto:bruce.tate@j2life.com?subject=  语言特性&amp;cc=bruce.tate@j2life.com"><font color="#5c81a7">bruce.tate@j2life.com</font></a>),&nbsp;总裁,&nbsp;RapidRed</p> <a href="http://hi.baidu.com/handylee/blog/item/e89952df71340f13495403dc.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/web2%2E0%26%2338%3Bjs%26%2338%3Bajax">web2.0&#38;js&#38;ajax</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/e89952df71340f13495403dc.html#comment">查看评论</a>]]></description>
        <pubDate>2007年02月10日 星期六  09:30</pubDate>
        <category><![CDATA[web2.0&#38;js&#38;ajax]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/e89952df71340f13495403dc.html</guid>
</item>

<item>
        <title><![CDATA[.Net Framework 2.0]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/17de7a099f606faf2eddd4ed.html]]></link>
        <description><![CDATA[
		
		<p>哈哈 踏破铁蹄无觅处，终于找到.Net Framework 2.0的安装文件了，我是装了VS.Net的,.Net Framework 是自己已经自动安装好的，可我要回家了，家里的破机器跑VS的话，速度估计会让我去自杀，咱还是就装个Net Framework ，不用什么IDE,就用EditPlus编写编译算了。Editplus现在成了我最最爱的工具软件，被我配置的既能编译C,也能调试PHP,又可利用.Net Framework的csc.exe 编译我的C#生成.Net应用程序，窗体程序都可以，</p>
<p>此外，我还下了不少自动完成文件，够用了。it is so cool!<img style="WIDTH: auto" alt="吻" src="http://static.xiaonei.com/img/editor/emot/emot-16.gif">爱死编写Editplus的人了，听说是韩国的软件，哎。</p>
<p>跑题了，装完VS后，其实Net Framework 的安装程序也都给你了，一般路径在<font face="Courier">C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727</font></p>
<p>这个后边的是版本号 我的是.Net framework 2.0.5的呵呵算高了，</p>
<p>到了这个目录下，看到<font color="#ff0000"><strong>Microsoft .NET Framework 2.0</strong></font>文件夹没有？就是它了，里面的install.exe就是安装文件，把这个<strong><font color="#ff0000">文件夹</font></strong>(一定要是整个文件夹）打包发给没有装框架的其他机器，安装完后，就可运行基于.NET的应用程序了，当然等N年以后 大家都用上Vista就不用这么费事了，XP以后的Ms操作系统都包含了.Net Framework了。还有个</p>
<p>Microsoft .NET Framework 2.0 Language Pack - CHS文件夹 是语言包如果写的应用程序要支持中文，最好也把这个装了，这两个文件夹总大小29.4MB,不算太大是吧？欢迎正在学习.Net C#的各位同学和我一起来研究学习。</p> <a href="http://hi.baidu.com/handylee/blog/item/17de7a099f606faf2eddd4ed.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/17de7a099f606faf2eddd4ed.html#comment">查看评论</a>]]></description>
        <pubDate>2007年02月09日 星期五  17:07</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/17de7a099f606faf2eddd4ed.html</guid>
</item>

<item>
        <title><![CDATA[prototype 1.5 API出来了]]></title>
        <link><![CDATA[http://hi.baidu.com/handylee/blog/item/bee1fb031cdb63ec08fa93e3.html]]></link>
        <description><![CDATA[
		
		<p>到<a target="_blank" href="http://www.prototypejs.org/">prototype</a>站点上一逛，发现竟然推出了1.5版本的api，开心啊，又可以深入了解与学习了，还有pdf版本的，我把它下载了下来，提供了firefox的&nbsp;sidebar扩展，不过我安装后，没法用&nbsp;不知是不是因为我的火狐是2。0版本。&nbsp;没办法只好自己一个一个的加书签</p>
<div forimg="1"><img border="0" small="0" class="blogimg" src="http://hiphotos.baidu.com/handylee/pic/item/a7dd58e744da1e2cb938205b.jpg"></div>
<div forimg="1">火狐的书签搜索功能不错&nbsp;遇到&nbsp;不熟悉的函数&nbsp;一搜索&nbsp;就出来了，呵呵</div>
<div forimg="1">
<div forimg="1"><img border="0" small="0" class="blogimg" src="http://hiphotos.baidu.com/handylee/pic/item/a7c506d174c8c3d1572c8421.jpg"></div>
</div>
<p>&nbsp;</p> <a href="http://hi.baidu.com/handylee/blog/item/bee1fb031cdb63ec08fa93e3.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/web2%2E0%26%2338%3Bjs%26%2338%3Bajax">web2.0&#38;js&#38;ajax</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/bee1fb031cdb63ec08fa93e3.html#comment">查看评论</a>]]></description>
        <pubDate>2007年02月09日 星期五  17:04</pubDate>
        <category><![CDATA[web2.0&#38;js&#38;ajax]]></category>
        <author><![CDATA[handyle]]></author>
		<guid>http://hi.baidu.com/handylee/blog/item/bee1fb031cdb63ec08fa93e3.html</guid>
</item>


</channel>
</rss>