<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[WEB前端开发]]></title>
<link>http://www.css88.com/</link>
<description><![CDATA[]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[feiwen8772@hotmail.com(愚人码头)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>WEB前端开发</title> 
	<url>http://www.css88.com/images/logos.gif</url> 
	<link>http://www.css88.com/</link> 
	<description>WEB前端开发</description> 
</image>

			<item>
			<link>http://www.css88.com/default.asp?id=422</link>
			<title><![CDATA[特别的iphone手机内图标png]]></title>
			<author>feiwen8772@hotmail.com(feiwen8772)</author>
			<category><![CDATA[设计及素材]]></category>
			<pubDate>Sun,06 Jul 2008 03:02:08 +0800</pubDate>
			<guid>http://www.css88.com/default.asp?id=422</guid>	
		<description><![CDATA[<p>这是漂亮啊，忍不住共享给大家，</p>
<p><img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_001.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_002.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_003.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_004.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_005.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_006.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_007.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_008.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_009.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_010.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_011.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_012.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_013.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_014.png" />&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.zcool.com.cn/pic/png3/132/CMT_iPhone_015.png" />&nbsp;&nbsp;&nbsp;&nbsp; </p>]]></description>
		</item>
		
			<item>
			<link>http://www.css88.com/default.asp?id=421</link>
			<title><![CDATA[CSS规则层叠]]></title>
			<author>feiwen8772@hotmail.com(feiwen8772)</author>
			<category><![CDATA[(X)HTML/CSS]]></category>
			<pubDate>Sun,06 Jul 2008 01:12:23 +0800</pubDate>
			<guid>http://www.css88.com/default.asp?id=421</guid>	
		<description><![CDATA[<p>理论基础是必要的，实践是提升和理解理论的方法，两者同样重要，任何设计和开发人员离开这两者的平衡，不论偏向哪一方，都会范或左或右的错误。不过我所讲的这个方法在实际应用中到底有什么用呢。显然，它不能够给我们创造出圆角矩形，也不能够给我们创造出分列布局，更加不可能给我们一个固定在文档头部的导航栏。这个算法的实践应用在于： <strong>良好的CSS编程规范</strong> 。这是一个宏观的实践，与我刚才提到的微观实践同样重要，但却更加难以掌握。</p>
<p>本文并不想包含所有的良好的CSS编程规范，也不可能，我所能够提供的也只是我个人编写CSS的规范小结，我想这些规范是尽可能靠近CSS的运作本质的。</p>
<ul>
    <li>不要使用inline <span class="caps">CSS</span> </li>
    <li>user style不在你的掌控之内 </li>
    <li>不要使用important规则 </li>
    <li>按照特殊性从低到高编写CSS </li>
</ul>
<p>前三条不是我说的重点，我将一笔带过。</p>
<p>inline CSS的特殊性是最高的，如果你CSS文件中的属性与inline CSS冲突，那么你CSS文件中的属性无效，这和我们仅在CSS文件中对样式进行debug的习惯不符。inline CSS也是丑陋的，它将样式插入HTML文档，所以应当放弃使用inline CSS。</p>
<p>如果用户将user style设置为important，那么不论怎么写CSS规则，总是不能覆盖用户的important语句，所以试图覆盖所有的user style是徒劳的。高兴的是我们不需要考虑这些了。</p>
<p>important规则是个异类，它不符合我们惯有的思维方式，不论我们如何增加CSS规则的特殊性和先后顺序，important规则都将覆盖与它竞争的规则，这也会打乱CSS规则的习惯规律，给debug带来麻烦。如果你要 <a href="http://www.ibloomstudios.com/articles/the_ie7_css_hack/">使用important规则来hack浏览器</a> ，那么你应当在一个指向唯一元素的selector中应用该规则。（PS. hack应当是解决方法中最后考虑的一项，因为它长得太丑陋了。）</p>
<p>最后一点，如何做到按照特殊性从低到高编写CSS？</p>
<p>关键在于 <strong>模块化CSS</strong> 。</p>
<ol>
    <li>添加全局CSS </li>
    <li>添加当前页面统一CSS </li>
    <li>将页面分成几个模块 </li>
    <li>在每个不同模块上使用id挂钩，相同模块上使用class挂钩 </li>
    <li>添加每个模块的统一CSS </li>
    <li>将每个模块分成几个子模块，并且回到第4步开始循环直至样式添加完成。 </li>
</ol>
<p>编写良好的CSS是一个设计问题，而不是一个实现问题。我们首先应当将编写特殊性非常低的全局CSS内容，也就是我们 <a href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">常用的reset.css</a> 。它是我们整个网站中所有页面的默认样式。</p>
<p>如果有哪个页面具有独特的统一样式，如某一页的背景与其他页面不同，那么我们可以给某一页面添加ID，然后在ID下编写当前页面的统一CSS。</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">body#special{
background-color:black;
}</font>
</code></pre>
<p>统一样式编写好后，我们将页面分成几个模块，如果这些模块具有基本相同的样式，那么使用class挂钩，如果样式并非相同，那么使用id挂钩，以后每次分模块时都应当遵循这一原则，因为class的特殊性不高，所以如果不是看起来显然类似的模块，就不应当使用class。id的名字通常可以模块的用途作为名字。如 <code>head</code> 、 <code>bottom</code> 等。id selector在层叠中起了关键作用，因为id具有排他性，还具有较高的特殊性，能够防止CSS规则被不经意的覆盖。</p>
<p>在某个模块中我们可能有一些统一CSS，那么我们就需要在使用id selector来编写当前模块下的统一样式。</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">#head p{
color:red;
}</font>
</code></pre>
<p>添加class挂钩时，我建议使用父模块（或者页面本身）的id在作为class名的第一部分。如果我添加一个独立的页面(<code>body#special</code>)，那么为该页面分好模块后，我应当将该页的模块命名为 <code>special_head</code> 、 <code>special_bottom</code> 等。</p>
<p>或者在某些页面模块中使用class挂钩时应当使用 <code>head_col</code> 等。这样做的好处是我们不用使用</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">#head .col{
/* 头部中每一列的样式 */
}</font>
</code></pre>
<p>而可以直接使用</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">.head_col{
/* 头部中每一列的样式 */
}</font>
</code></pre>
<p>从而不用担心命名冲突。</p>
<p>而对于模块下直接添加了id selector的元素，我们可以直接使用该selector，并且也在其名字前添加父模块的id。</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">#head_navigator{
/* 头部中导航栏的样式 */
}</font>
</code></pre>
<p>要做到模块化CSS我们应当尽量防止跨模块的CSS出现，我想一条好的原则是：如果某一样式的跨模块特性不是你一目了然的，那么就不要使用跨模块的CSS。一个例外是全局CSS或者模块内的统一CSS。而对于那些并非一目了然的，并非具有统一样式的，建议在每个子模块下分别定义。这就像是编写Java程序中的面向对象的设计一样，我们要降低模块之间的互相依赖，使得相同模块的CSS规则在一起，略有不同的就完全分开，这样不但易于维护，还能够保证特殊性从低到高地编写CSS，从而防止CSS规则被意外的覆盖。</p>]]></description>
		</item>
		
			<item>
			<link>http://www.css88.com/default.asp?id=420</link>
			<title><![CDATA[CSS规则层叠时的优先级]]></title>
			<author>feiwen8772@hotmail.com(feiwen8772)</author>
			<category><![CDATA[(X)HTML/CSS]]></category>
			<pubDate>Sun,06 Jul 2008 01:00:44 +0800</pubDate>
			<guid>http://www.css88.com/default.asp?id=420</guid>	
		<description><![CDATA[<p><acronym title="Cascading Style Sheet"><span class="caps">CSS</span></acronym> 规则的优先级是Web前端开发人员必须理解的一个概念，我们常用的添加样式的方法有4种。 </p>
<ul>
    <li>inline style </li>
    <li>embeded style </li>
    <li>external style </li>
    <li>user style </li>
</ul>
<p>inline style是丑陋的，它们穿梭在HTML文档中，与HTML元素扭成一团，给Web前端开发人员造成了许多麻烦。它们往往以这样的面目出现：</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">&lt;p style=&quot;color:red;&quot;&gt;This is a paragraph.&lt;/p&gt;</font>
</code></pre>
<p>embeded style比inline style绅士一些，它们也寄宿在HTML文档中，但是它们不屑于与HTML元素扭成一团。它们往往在 <code>&lt;style&gt;</code> 元素中出现：</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">&lt;style type=&quot;text/css&quot; media=&quot;screen&quot;&gt;
p{
color : red;
}
&lt;/style&gt;</font>
</code></pre>
<p>external style是个贵族，它不愿意同HTML呆在一起，所以干脆以外部文件的形式独立存在。通常我们使用 <code>&lt;link&gt;</code> 元素或者<code>@import</code>语句将它们导入HTML。</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;style.css&quot; media=&quot;screen&quot; /&gt;</font>
</code></pre>
<p>我们应当尽可能使用external style，我想理由有很多，大家都知道，我也就不重复了。</p>
<p>还有一种user style与以上三者略有不同，如果你使用IE浏览器，那么你可以在Tools &ndash; Internet Options &ndash; General &ndash; Appearance &ndash; Accessibility &ndash; User style sheet 下找到添加user style的地方（原谅我没有中文版的IE浏览器）。</p>
<p>既然我们有如此多的添加style的方法，那么难以避免样式会产生层叠。如：</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">&lt;p class=&quot;intro&quot; style=&quot;color:red;&quot;&gt;This is a paragraph.&lt;/p&gt;</font>
</code></pre>
<p>我们在使用以上inline style的同时，又在我们的external style中使用了：</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">p{
color : yellow;
}</font>
</code></pre>
<p>我们甚至还在拥有 <code>class=&quot;intro&quot;</code> 的 <code>&lt;p&gt;</code> 元素上应用了：</p>
<pre><code><font style="BACKGROUND-COLOR: #ff99cc">p.intro{
color : blue;
}</font>
</code></pre>
<p>这样我们就 <strong>在同一元素的同一属性 <code>color</code> 上，拥有多条CSS规则指定了值</strong> 。这种情况被称为层叠(Cascading)。当层叠发生时，CSS Parser将根据优先级算法来确定最终选用的值。 </p>
<p>优先级算法按照先后顺序考虑以下三个方面：</p>
<ol>
    <li>CSS规则的重要性和来源 </li>
    <li>CSS规则的特殊性 </li>
    <li>CSS规则在文档中出现的顺序 </li>
</ol>
<p>算法过程分为4步：</p>
<p>1、针对某一元素的某一属性，列出所有给该属性指定值的CSS规则。如上例中，在 <code>class=&quot;intro&quot;</code> 的 <code>&lt;p&gt;</code> 元素上，有三条CSS规则指定了 <code>color</code> 属性。</p>
<p>2、根据声明的重要性和来源进行优先级排序</p>
<p>重要性有两种：</p>
<ul>
    <li>important </li>
    <li>normal（即非important） </li>
</ul>
<p>在CSS规则后添加 <code>!important</code> 的重要性要高于没有添加的。</p>
<p>来源有三种：</p>
<ul>
    <li>user agent stylesheet &ndash; 浏览器默认样式 </li>
    <li>author stylesheet &ndash; 开发人员定义的样式 </li>
    <li>user stylesheet &ndash; 用户在浏览器中定义样式 </li>
</ul>
<p>重要性和来源的优先级排序从低到高是：</p>
<ol>
    <li>user agent stylesheet </li>
    <li>user style sheets中的normal规则 </li>
    <li>author style sheets中的normal规则 </li>
    <li>author style sheets中的important规则 </li>
    <li>user style sheets中的important规则 </li>
</ol>
<p>经过以上排序，如果有一条CSS规则的优先级高于其他所有竞争规则，那么算法结束，返回该最高优先级指定的值。如果有多条CSS规则具有最高优先级，那么它们将要继续竞争下去，算法将进入第3步。</p>
<p>3、按照特殊性（Specificity）排序</p>
<p>CSS将计算多条规则中指定每一规则的selector的特殊性值，该值越高，优先级越高。</p>
<p>特殊性值是一个由4个整数组成的一个类似数组的值：a,b,c,d，其中a的权重最高，依次类推，d的权重最低。selector特殊性值的计算方法是：</p>
<ul>
    <li>如果该规则是一条inline style，那么a = 1 </li>
    <li>如果该规则由selector指定，selector中出现的id selector的数量就是b的值 </li>
    <li>如果该规则由selector指定，selector中出现的属性selector（包括class selector）或者伪类selector的数量总和就是c的值 </li>
    <li>如果该规则由selector指定，selector中出现的元素selector或者是伪元素selector的数量总和就是d的值。 </li>
    <li>universal selector <code>*</code> 的特殊性值为0,0,0,0 </li>
</ul>
<p><a href="http://www.w3.org/TR/CSS21/cascade.html#specificity">官方网站</a> 提供了一些例子可以加深理解。</p>
<p>在根据特殊性值排序时，由于a的权重最高，因此首先比较a，在a相同的情况，在比较b，依次类推。因此不论b,c,d值有多大，inline style总是具有最高的特殊性。</p>
<p>如果根据以上特殊性排序后，有一条CSS规则的优先级高于其他所有竞争规则，那么算法结束，返回该最高优先级指定的值。如果有多条CSS规则具有最高优先级，那么它们将要继续竞争下去，算法将进入第4步。</p>
<p>4、比较CSS规则在文档中出现的顺序</p>
<p>出现在后的总是比出现在前的具有更高的优先级，因此出现在最后的那条语句将被作为该属性的值。</p>
<p>至此，算法结束。我彻底晕了。</p>]]></description>
		</item>
		
			<item>
			<link>http://www.css88.com/default.asp?id=419</link>
			<title><![CDATA[[转] 悟透JavaScript]]></title>
			<author>feiwen8772@hotmail.com(feiwen8772)</author>
			<category><![CDATA[前端开发]]></category>
			<pubDate>Sat,05 Jul 2008 00:06:06 +0800</pubDate>
			<guid>http://www.css88.com/default.asp?id=419</guid>	
		<description><![CDATA[<strong>引子<br /><br /></strong>&nbsp;&nbsp;&nbsp; 编程世界里只存在两种基本元素，一个是数据，一个是代码。编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;数据天生就是文静的，总想保持自己固有的本色；而代码却天生活泼，总想改变这个世界。<br />&nbsp;<br />&nbsp;&nbsp; 你看，数据代码间的关系与物质能量间的关系有着惊人的相似。数据也是有惯性的，如果没有代码来施加外力，她总保持自己原来的状态。而代码就象能量，他存在的唯一目的，就是要努力改变数据原来的状态。在代码改变数据的同时，也会因为数据的抗拒而反过来影响或改变代码原有的趋势。甚至在某些情况下，数据可以转变为代码，而代码却又有可能被转变为数据，或许还存在一个类似E=MC2形式的数码转换方程呢。然而，就是在数据和代码间这种即矛盾又统一的运转中，总能体现出计算机世界的规律，这些规律正是我们编写的程序逻辑。<br /><br />&nbsp;&nbsp;&nbsp; 不过，由于不同程序员有着不同的世界观，这些数据和代码看起来也就不尽相同。于是，不同世界观的程序员们运用各自的方法论，推动着编程世界的进化和发展。<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; 众所周知，当今最流行的编程思想莫过于面向对象编程的思想。为什么面向对象的思想能迅速风靡编程世界呢？因为面向对象的思想首次把数据和代码结合成统一体，并以一个简单的对象概念呈现给编程者。这一下子就将原来那些杂乱的算法与子程序，以及纠缠不清的复杂数据结构，划分成清晰而有序的对象结构，从而理清了数据与代码在我们心中那团乱麻般的结。我们又可以有一个更清晰的思维，在另一个思想高度上去探索更加浩瀚的编程世界了。<br /><br />&nbsp;&nbsp;&nbsp; 在五祖弘忍讲授完《对象真经》之后的一天，他对众弟子们说：&ldquo;经已讲完，想必尔等应该有所感悟，请各自写个偈子来看&rdquo;。大弟子神秀是被大家公认为悟性最高的师兄，他的偈子写道：&ldquo;身是对象树，心如类般明。朝朝勤拂拭，莫让惹尘埃！&rdquo;。此偈一出，立即引起师兄弟们的轰动，大家都说写得太好了。只有火头僧慧能看后，轻轻地叹了口气，又随手在墙上写道：&ldquo;对象本无根，类型亦无形。本来无一物，何处惹尘埃？&rdquo;。然后摇了摇头，扬长而去。大家看了慧能的偈子都说： &ldquo;写的什么乱七八糟的啊，看不懂&rdquo;。师父弘忍看了神秀的诗偈也点头称赞，再看慧能的诗偈之后默然摇头。就在当天夜里，弘忍却悄悄把慧能叫到自己的禅房，将珍藏多年的软件真经传授于他，然后让他趁着月色连夜逃走...<br /><br />&nbsp;&nbsp;&nbsp; 后来，慧能果然不负师父厚望，在南方开创了禅宗另一个广阔的天空。而慧能当年带走的软件真经中就有一本是《JavaScript真经》！<br /><br /><strong>回归简单<br /></strong><br />&nbsp;&nbsp;&nbsp; 要理解JavaScript，你得首先放下对象和类的概念，回到数据和代码的本原。前面说过，编程世界只有数据和代码两种基本元素，而这两种元素又有着纠缠不清的关系。JavaScript就是把数据和代码都简化到最原始的程度。<br /><br />&nbsp;&nbsp;&nbsp; JavaScript中的数据很简洁的。简单数据只有 undefined, null, boolean, number和string这五种，而复杂数据只有一种，即object。这就好比中国古典的朴素唯物思想，把世界最基本的元素归为金木水火土，其他复杂的物质都是由这五种基本元素组成。<br /><br />&nbsp;&nbsp;&nbsp; JavaScript中的代码只体现为一种形式，就是function。<br /><br />&nbsp;&nbsp;&nbsp; 注意：以上单词都是小写的，不要和Number, String, Object, Function等JavaScript内置函数混淆了。要知道，JavaScript语言是区分大小写的呀!<br /><br />&nbsp;&nbsp;&nbsp; 任何一个JavaScript的标识、常量、变量和参数都只是unfined, null, bool, number, string, object 和 function类型中的一种，也就typeof返回值表明的类型。除此之外没有其他类型了。<br /><br />&nbsp;&nbsp;&nbsp; 先说说简单数据类型吧。<br /><br />&nbsp;&nbsp;&nbsp; undefined:&nbsp;&nbsp; 代表一切未知的事物，啥都没有，无法想象，代码也就更无法去处理了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：typeof(undefined) 返回也是 undefined。<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; 可以将undefined赋值给任何变量或属性，但并不意味了清除了该变量，反而会因此多了一个属性。<br /><br />&nbsp;&nbsp;&nbsp; null:&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：typeof(null)返回object，但null并非object，具有null值的变量也并非object。<br /><br />&nbsp;&nbsp;&nbsp; boolean:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是就是，非就非，没有疑义。对就对，错就错，绝对明确。既能被代码处理，也可以控制代码的流程。<br /><br />&nbsp;&nbsp;&nbsp; number:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 线性的事物，大小和次序分明，多而不乱。便于代码进行批量处理，也控制代码的迭代和循环等。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：typeof(NaN)和typeof(Infinity)都返回number 。<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; NaN参与任何数值计算的结构都是NaN，而且 NaN != NaN 。<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; Infinity / Infinity = NaN 。<br /><br />&nbsp;&nbsp;&nbsp; string:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面向人类的理性事物，而不是机器信号。人机信息沟通，代码据此理解人的意图等等，都靠它了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 简单类型都不是对象，JavaScript没有将对象化的能力赋予这些简单类型。直接被赋予简单类型常量值的标识符、变量和参数都不是一个对象。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;所谓&ldquo;对象化&rdquo;，就是可以将数据和代码组织成复杂结构的能力。JavaScript中只有object类型和function类型提供了对象化的能力。<br /><br /><strong>没有类<br /></strong><br />&nbsp;&nbsp;&nbsp; object就是对象的类型。在JavaScript中不管多么复杂的数据和代码，都可以组织成object形式的对象。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;但JavaScript却没有 &ldquo;类&rdquo;的概念！<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 对于许多面向对象的程序员来说，这恐怕是JavaScript中最难以理解的地方。是啊，几乎任何讲面向对象的书中，第一个要讲的就是&ldquo;类&rdquo;的概念，这可是面向对象的支柱。这突然没有了&ldquo;类&rdquo;，我们就象一下子没了精神支柱，感到六神无主。看来，要放下对象和类，达到&ldquo;对象本无根，类型亦无形&rdquo;的境界确实是件不容易的事情啊。<br /><br />&nbsp;&nbsp;&nbsp; 这样，我们先来看一段JavaScript程序：
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;life&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">for</span><span style="COLOR: rgb(0,0,0)">(life.age&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">;&nbsp;life.age&nbsp;</span><span style="COLOR: rgb(0,0,0)">&lt;=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">3</span><span style="COLOR: rgb(0,0,0)">;&nbsp;life.age</span><span style="COLOR: rgb(0,0,0)">++</span><span style="COLOR: rgb(0,0,0)">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">switch</span><span style="COLOR: rgb(0,0,0)">(life.age)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">case</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">:&nbsp;life.body&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">卵细胞</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.say&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(){alert(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.age</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.body)};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">break</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">case</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">2</span><span style="COLOR: rgb(0,0,0)">:&nbsp;life.tail&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">尾巴</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.gill&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">腮</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.body&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">蝌蚪</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.say&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(){alert(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.age</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.body</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.tail</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.gill)};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">break</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">case</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">3</span><span style="COLOR: rgb(0,0,0)">:&nbsp;</span><span style="COLOR: rgb(0,0,255)">delete</span><span style="COLOR: rgb(0,0,0)">&nbsp;life.tail;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">delete</span><span style="COLOR: rgb(0,0,0)">&nbsp;life.gill;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.legs&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">四条腿</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.lung&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">肺</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.body&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">青蛙</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.say&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(){alert(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.age</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.body</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.legs</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.lung)};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">break</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life.say();<br />&nbsp;&nbsp;&nbsp;&nbsp;};</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 这段JavaScript程序一开始产生了一个生命对象life，life诞生时只是一个光溜溜的对象，没有任何属性和方法。在第一次生命过程中，它有了一个身体属性body，并有了一个say方法，看起来是一个&ldquo;卵细胞&rdquo;。在第二次生命过程中，它又长出了&ldquo;尾巴&rdquo;和&ldquo;腮&rdquo;，有了tail和gill属性，显然它是一个&ldquo;蝌蚪&rdquo;。在第三次生命过程中，它的tail和gill属性消失了，但又长出了&ldquo;四条腿&rdquo;和&ldquo;肺&rdquo;，有了legs和lung属性，从而最终变成了&ldquo;青蛙&rdquo;。如果，你的想像力丰富的话，或许还能让它变成英俊的&ldquo;王子&rdquo;，娶个美丽的&ldquo;公主&rdquo;什么的。不过，在看完这段程序之后，请你思考一个问题：<br /><br />&nbsp;&nbsp;&nbsp; 我们一定需要类吗？<br /><br />&nbsp;&nbsp;&nbsp; 还记得儿时那个&ldquo;小蝌蚪找妈妈&rdquo;的童话吗？也许就在昨天晚，你的孩子刚好是在这个美丽的童话中进入梦乡的吧。可爱的小蝌蚪也就是在其自身类型不断演化过程中，逐渐变成了和妈妈一样的&ldquo;类&rdquo;，从而找到了自己的妈妈。这个童话故事中蕴含的编程哲理就是：对象的&ldquo;类&rdquo;是从无到有，又不断演化，最终又消失于无形之中的...<br /><br />&nbsp;&nbsp;&nbsp; &ldquo;类&rdquo;，的确可以帮助我们理解复杂的现实世界，这纷乱的现实世界也的确需要进行分类。但如果我们的思想被&ldquo;类&rdquo;束缚住了，&ldquo;类&rdquo;也就变成了&ldquo;累&rdquo;。想象一下，如果一个生命对象开始的时就被规定了固定的&ldquo;类&rdquo;，那么它还能演化吗？蝌蚪还能变成青蛙吗？还可以给孩子们讲小蝌蚪找妈妈的故事吗？<br /><br />&nbsp;&nbsp;&nbsp; 所以，JavaScript中没有&ldquo;类&rdquo;，类已化于无形，与对象融为一体。正是由于放下了&ldquo;类&rdquo;这个概念，JavaScript的对象才有了其他编程语言所没有的活力。<br /><br />&nbsp;&nbsp;&nbsp; 如果，此时你的内心深处开始有所感悟，那么你已经逐渐开始理解JavaScript的禅机了。<br /><br /><strong>函数的魔力</strong><br /><br />&nbsp;&nbsp;&nbsp; 接下来，我们再讨论一下JavaScript函数的魔力吧。<br /><br />&nbsp;&nbsp;&nbsp; JavaScript的代码就只有function一种形式，function就是函数的类型。也许其他编程语言还有procedure或 method等代码概念，但在JavaScript里只有function一种形式。当我们写下一个函数的时候，只不过是建立了一个function类型的实体而已。请看下面的程序：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;myfunc()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">hello</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,255)">typeof</span><span style="COLOR: rgb(0,0,0)">(myfunc));</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 这个代码运行之后可以看到typeof(myfunc)返回的是function。以上的函数写法我们称之为&ldquo;定义式&rdquo;的，如果我们将其改写成下面的&ldquo;变量式&rdquo;的，就更容易理解了：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;myfunc&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">hello</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,255)">typeof</span><span style="COLOR: rgb(0,0,0)">(myfunc));</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 这里明确定义了一个变量myfunc，它的初始值被赋予了一个function的实体。因此，typeof(myfunc)返回的也是function。其实，这两种函数的写法是等价的，除了一点细微差别，其内部实现完全相同。也就是说，我们写的这些JavaScript函数只是一个命了名的变量而已，其变量类型即为function，变量的值就是我们编写的函数代码体。<br /><br />&nbsp;&nbsp;&nbsp; 聪明的你或许立即会进一步的追问：既然函数只是变量，那么变量就可以被随意赋值并用到任意地方啰？<br /><br />&nbsp;&nbsp;&nbsp; 我们来看看下面的代码：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;myfunc&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">hello</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">第一次调用myfunc，输出hello</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;myfunc&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">yeah</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">第二次调用myfunc，将输出yeah</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 这个程序运行的结果告诉我们：答案是肯定的！在第一次调用函数之后，函数变量又被赋予了新的函数代码体，使得第二次调用该函数时，出现了不同的输出。<br /><br />&nbsp;&nbsp;&nbsp; 好了，我们又来把上面的代码改成第一种定义式的函数形式：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;myfunc&nbsp;()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">hello</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">这里调用myfunc，输出yeah而不是hello</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;myfunc&nbsp;()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">yeah</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">这里调用myfunc，当然输出yeah</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 按理说，两个签名完全相同的函数，在其他编程语言中应该是非法的。但在JavaScript中，这没错。不过，程序运行之后却发现一个奇怪的现象：两次调用都只是最后那个函数里输出的值！显然第一个函数没有起到任何作用。这又是为什么呢？<br /><br />&nbsp;&nbsp;&nbsp; 原来，JavaScript执行引擎并非一行一行地分析和执行程序，而是一段一段地分析执行的。而且，在同一段程序的分析执行中，定义式的函数语句会被提取出来优先执行。函数定义执行完之后，才会按顺序执行其他语句代码。也就是说，在第一次调用myfunc之前，第一个函数语句定义的代码逻辑，已被第二个函数定义语句覆盖了。所以，两次都调用都是执行最后一个函数逻辑了。<br /><br />&nbsp;&nbsp;&nbsp; 如果把这个JavaScript代码分成两段，例如将它们写在一个html中，并用&lt;script/&gt;标签将其分成这样的两块：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">script</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">function</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;myfunc&nbsp;()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&quot;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">hello</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&quot;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;</span><span style="COLOR: rgb(0,128,0); BACKGROUND-COLOR: rgb(245,245,245)">//</span><span style="COLOR: rgb(0,128,0); BACKGROUND-COLOR: rgb(245,245,245)">这里调用myfunc，输出hello</span><span style="COLOR: rgb(0,128,0); BACKGROUND-COLOR: rgb(245,245,245)"><br /></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">script</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /><br /></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">script</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">function</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;myfunc&nbsp;()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&quot;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">yeah</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&quot;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;</span><span style="COLOR: rgb(0,128,0); BACKGROUND-COLOR: rgb(245,245,245)">//</span><span style="COLOR: rgb(0,128,0); BACKGROUND-COLOR: rgb(245,245,245)">这里调用myfunc，输出yeah</span><span style="COLOR: rgb(0,128,0); BACKGROUND-COLOR: rgb(245,245,245)"><br /></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">script</span><span style="COLOR: rgb(0,0,255)">&gt;</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 这时，输出才是各自按顺序来的，也证明了JavaScript的确是一段段地执行的。<br /><br />&nbsp;&nbsp;&nbsp; 一段代码中的定义式函数语句会优先执行，这似乎有点象静态语言的编译概念。所以，这一特征也被有些人称为：JavaScript的&ldquo;预编译&rdquo;。<br /><br />&nbsp;&nbsp;&nbsp; 大多数情况下，我们也没有必要去纠缠这些细节问题。只要你记住一点：JavaScript里的代码也是一种数据，同样可以被任意赋值和修改的，而它的值就是代码的逻辑。只是，与一般数据不同的是，函数是可以被调用执行的。<br /><br />&nbsp;&nbsp;&nbsp; 不过，如果JavaScript函数仅仅只有这点道行的话，这与C++的函数指针，DELPHI的方法指针，C#的委托相比，又有啥稀奇嘛！然而， JavaScript函数的神奇之处还体现在另外两个方面：一是函数function类型本身也具有对象化的能力，二是函数function与对象 object超然的结合能力。<br /><br /><strong>奇妙的对象</strong><br /><br />&nbsp;&nbsp;&nbsp; 先来说说函数的对象化能力。<br /><br />&nbsp;&nbsp;&nbsp; 任何一个函数都可以为其动态地添加或去除属性，这些属性可以是简单类型，可以是对象，也可以是其他函数。也就是说，函数具有对象的全部特征，你完全可以把函数当对象来用。其实，函数就是对象，只不过比一般的对象多了一个括号&ldquo;()&rdquo;操作符，这个操作符用来执行函数的逻辑。即，函数本身还可以被调用，一般对象却不可以被调用，除此之外完全相同。请看下面的代码：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Sing()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">with</span><span style="COLOR: rgb(0,0,0)">(arguments.callee)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(author&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">：</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;poem);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;Sing.author&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">李白</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;Sing.poem&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">汉家秦地月，流影照明妃。一上玉关道，天涯去不归<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;Sing();<br />&nbsp;&nbsp;&nbsp;&nbsp;Sing.author&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">李战</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;Sing.poem&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">日出汉家天，月落阴山前。女儿琵琶怨，已唱三千年<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;Sing();</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 在这段代码中，Sing函数被定义后，又给Sing函数动态地增加了author和poem属性。将author和poem属性设为不同的作者和诗句，在调用Sing()时就能显示出不同的结果。这个示例用一种诗情画意的方式，让我们理解了JavaScript函数就是对象的本质，也感受到了 JavaScript语言的优美。<br /><br />&nbsp;&nbsp;&nbsp; 好了，以上的讲述，我们应该算理解了function类型的东西都是和object类型一样的东西，这种东西被我们称为&ldquo;对象&rdquo;。我们的确可以这样去看待这些&ldquo;对象&rdquo;，因为它们既有&ldquo;属性&rdquo;也有&ldquo;方法&rdquo;嘛。但下面的代码又会让我们产生新的疑惑：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;anObject&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;{};&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">一个对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;anObject.aProperty&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Property&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">对象的一个属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;anObject.aMethod&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(){alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Method&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">)};&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">对象的一个方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">主要看下面：</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;alert(anObject[</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">aProperty</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">]);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">可以将对象当数组以属性名作为下标来访问属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;anObject[</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">aMethod</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">]();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">可以将对象当数组以方法名作为下标来调用方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">for</span><span style="COLOR: rgb(0,0,0)">(&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;s&nbsp;</span><span style="COLOR: rgb(0,0,255)">in</span><span style="COLOR: rgb(0,0,0)">&nbsp;anObject)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">遍历对象的所有属性和方法进行迭代化处理</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(s&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;is&nbsp;a&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">typeof</span><span style="COLOR: rgb(0,0,0)">(anObject[s]));</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 同样对于function类型的对象也是一样：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;aFunction&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> function() {};&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">一个函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;aFunction.aProperty&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Property&nbsp;of&nbsp;function</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">函数的一个属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;aFunction.aMethod&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(){alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Method&nbsp;of&nbsp;function</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">)};&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">函数的一个方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">主要看下面：</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;alert(aFunction[</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">aProperty</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">]);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">可以将函数当数组以属性名作为下标来访问属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;aFunction[</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">aMethod</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">]();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">可以将函数当数组以方法名作为下标来调用方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">for</span><span style="COLOR: rgb(0,0,0)">(&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;s&nbsp;</span><span style="COLOR: rgb(0,0,255)">in</span><span style="COLOR: rgb(0,0,0)">&nbsp;aFunction)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">遍历函数的所有属性和方法进行迭代化处理</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(s&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;is&nbsp;a&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">typeof</span><span style="COLOR: rgb(0,0,0)">(aFunction[s]));</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 是的，对象和函数可以象数组一样，用属性名或方法名作为下标来访问并处理。那么，它到底应该算是数组呢，还是算对象？<br /><br />&nbsp;&nbsp;&nbsp; 我们知道，数组应该算是线性数据结构，线性数据结构一般有一定的规律，适合进行统一的批量迭代操作等，有点像波。而对象是离散数据结构，适合描述分散的和个性化的东西，有点像粒子。因此，我们也可以这样问：JavaScript里的对象到底是波还是粒子？<br /><br />&nbsp;&nbsp;&nbsp; 如果存在对象量子论，那么答案一定是：波粒二象性！<br /><br />&nbsp;&nbsp;&nbsp; 因此，JavaScript里的函数和对象既有对象的特征也有数组的特征。这里的数组被称为&ldquo;字典&rdquo;，一种可以任意伸缩的名称值对儿的集合。其实， object和function的内部实现就是一个字典结构，但这种字典结构却通过严谨而精巧的语法表现出了丰富的外观。正如量子力学在一些地方用粒子来解释和处理问题，而在另一些地方却用波来解释和处理问题。你也可以在需要的时候，自由选择用对象还是数组来解释和处理问题。只要善于把握 JavaScript的这些奇妙特性，就可以编写出很多简洁而强大的代码来。<br /><br /><strong>放下对象</strong><br /><br />&nbsp;&nbsp;&nbsp; 我们再来看看function与object的超然结合吧。<br /><br />&nbsp;&nbsp;&nbsp; 在面向对象的编程世界里，数据与代码的有机结合就构成了对象的概念。自从有了对象，编程世界就被划分成两部分，一个是对象内的世界，一个是对象外的世界。对象天生具有自私的一面，外面的世界未经允许是不可访问对象内部的。对象也有大方的一面，它对外提供属性和方法，也为他人服务。不过，在这里我们要谈到一个有趣的问题，就是&ldquo;对象的自我意识&rdquo;。<br /><br />&nbsp;&nbsp;&nbsp; 什么？没听错吧？对象有自我意识？<br /><br />&nbsp;&nbsp;&nbsp; 可能对许多程序员来说，这的确是第一次听说。不过，请君看看C++、C#和Java的this，DELPHI的self，还有VB的me，或许你会恍然大悟！当然，也可能只是说句&ldquo;不过如此&rdquo;而已。<br /><br />&nbsp;&nbsp;&nbsp; 然而，就在对象将世界划分为内外两部分的同时，对象的&ldquo;自我&rdquo;也就随之产生。&ldquo;自我意识&rdquo;是生命的最基本特征！正是由于对象这种强大的生命力，才使得编程世界充满无限的生机和活力。<br /><br />&nbsp;&nbsp;&nbsp; 但对象的&ldquo;自我意识&rdquo;在带给我们快乐的同时也带来了痛苦和烦恼。我们给对象赋予了太多欲望，总希望它们能做更多的事情。然而，对象的自私使得它们互相争抢系统资源，对象的自负让对象变得复杂和臃肿，对象的自欺也往往带来挥之不去的错误和异常。我们为什么会有这么多的痛苦和烦恼呢？<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; 为此，有一个人，在对象树下，整整想了九九八十一天，终于悟出了生命的痛苦来自于欲望，但究其欲望的根源是来自于自我意识。于是他放下了&ldquo;自我&rdquo;，在对象树下成了佛，从此他开始普度众生，传播真经。他的名字就叫释迦摩尼，而《JavaScript真经》正是他所传经书中的一本。<br /><br />&nbsp;&nbsp;&nbsp; JavaScript中也有this，但这个this却与C++、C#或Java等语言的this不同。一般编程语言的this就是对象自己，而 JavaScript的this却并不一定！this可能是我，也可能是你，可能是他，反正是我中有你，你中有我，这就不能用原来的那个&ldquo;自我&rdquo;来理解 JavaScript这个this的含义了。为此，我们必须首先放下原来对象的那个&ldquo;自我&rdquo;。<br /><br />&nbsp;&nbsp;&nbsp; 我们来看下面的代码：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;WhoAmI()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">定义一个函数WhoAmI</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">I'm&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;of&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">typeof</span><span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">));<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">此时是this当前这段代码的全局对象，在浏览器中就是window对象，其name属性为空字符串。输出：I'm&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;BillGates&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;{name:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Bill&nbsp;Gates</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">};<br />&nbsp;&nbsp;&nbsp;&nbsp;BillGates.WhoAmI&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;WhoAmI;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将函数WhoAmI作为BillGates的方法。</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;BillGates.WhoAmI();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">此时的this是BillGates。输出：I'm&nbsp;Bill&nbsp;Gates&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;{name:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Steve&nbsp;Jobs</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">};<br />&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.WhoAmI&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;WhoAmI;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将函数WhoAmI作为SteveJobs的方法。</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.WhoAmI();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">此时的this是SteveJobs。输出：I'm&nbsp;Steve&nbsp;Jobs&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)"><br />&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.call(BillGates);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">直接将BillGates作为this，调用WhoAmI。输出：I'm&nbsp;Bill&nbsp;Gates&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.call(SteveJobs);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">直接将SteveJobs作为this，调用WhoAmI。输出：I'm&nbsp;Steve&nbsp;Jobs&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BillGates.WhoAmI.call(SteveJobs);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将SteveJobs作为this，却调用BillGates的WhoAmI方法。输出：I'm&nbsp;Steve&nbsp;Jobs&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.WhoAmI.call(BillGates);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将BillGates作为this，却调用SteveJobs的WhoAmI方法。输出：I'm&nbsp;Bill&nbsp;Gates&nbsp;of&nbsp;object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)"><br />&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.WhoAmI&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;WhoAmI;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将WhoAmI函数设置为自身的方法。</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">WhoAmI</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;<br />&nbsp;&nbsp;&nbsp;&nbsp;WhoAmI.WhoAmI();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">此时的this是WhoAmI函数自己。输出：I'm&nbsp;WhoAmI&nbsp;of&nbsp;function</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;({name:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">nobody</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;WhoAmI:&nbsp;WhoAmI}).WhoAmI();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">临时创建一个匿名对象并设置属性后调用WhoAmI方法。输出：I'm&nbsp;nobody&nbsp;of&nbsp;object</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 从上面的代码可以看出，同一个函数可以从不同的角度来调用，this并不一定是函数本身所属的对象。this只是在任意对象和function元素结合时的一个概念，是种结合比起一般对象语言的默认结合更加灵活，显得更加超然和洒脱。<br /><br />&nbsp;&nbsp;&nbsp; 在JavaScript函数中，你只能把this看成当前要服务的&ldquo;这个&rdquo;对象。this是一个特殊的内置参数，根据this参数，您可以访问到&ldquo;这个&rdquo; 对象的属性和方法，但却不能给this参数赋值。在一般对象语言中，方法体代码中的this可以省略的，成员默认都首先是&ldquo;自己&rdquo;的。但 JavaScript却不同，由于不存在&ldquo;自我&rdquo;，当访问&ldquo;这个&rdquo;对象时，this不可省略！<br /><br />&nbsp;&nbsp;&nbsp; JavaScript提供了传递this参数的多种形式和手段，其中，象BillGates.WhoAmI()和SteveJobs.WhoAmI()这种形式，是传递this参数最正规的形式，此时的this就是函数所属的对象本身。而大多数情况下，我们也几乎很少去采用那些借花仙佛的调用形式。但只我们要明白JavaScript的这个&ldquo;自我&rdquo;与其他编程语言的&ldquo;自我&rdquo;是不同的，这是一个放下了的&ldquo;自我&rdquo;，这就是JavaScript特有的世界观。<br /><br /><strong>对象素描</strong><br /><br />&nbsp;&nbsp;&nbsp; 已经说了许多了许多话题了，但有一个很基本的问题我们忘了讨论，那就是：怎样建立对象？<br /><br />&nbsp;&nbsp;&nbsp; 在前面的示例中，我们已经涉及到了对象的建立了。我们使用了一种被称为JavaScript Object Notation(缩写JSON)的形式，翻译为中文就是&ldquo;JavaScript对象表示法&rdquo;。<br /><br />&nbsp;&nbsp;&nbsp; JSON为创建对象提供了非常简单的方法。例如，<br />&nbsp;&nbsp;&nbsp; 创建一个没有任何属性的对象：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;o&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;{};</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 创建一个对象并设置属性及初始值：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;person&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;{name:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Angel</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;age:&nbsp;</span><span style="COLOR: rgb(0,0,0)">18</span><span style="COLOR: rgb(0,0,0)">,&nbsp;married:&nbsp;</span><span style="COLOR: rgb(0,0,255)">false</span><span style="COLOR: rgb(0,0,0)">};</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 创建一个对象并设置属性和方法：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;speaker&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;{text:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hello&nbsp;World</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;say:&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(){alert(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.text)}};</span></div>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp; 创建一个更复杂的对象，嵌套其他对象和对象数组等：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;company&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Microsoft</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">softwares</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chairman:&nbsp;{name:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Bill&nbsp;Gates</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;age:&nbsp;</span><span style="COLOR: rgb(0,0,0)">53</span><span style="COLOR: rgb(0,0,0)">,&nbsp;Married:&nbsp;</span><span style="COLOR: rgb(0,0,255)">true</span><span style="COLOR: rgb(0,0,0)">},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;employees:&nbsp;[{name:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Angel</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;age:&nbsp;</span><span style="COLOR: rgb(0,0,0)">26</span><span style="COLOR: rgb(0,0,0)">,&nbsp;Married:&nbsp;</span><span style="COLOR: rgb(0,0,255)">false</span><span style="COLOR: rgb(0,0,0)">},&nbsp;{name:&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hanson</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;age:&nbsp;</span><span style="COLOR: rgb(0,0,0)">32</span><span style="COLOR: rgb(0,0,0)">,&nbsp;Marred:&nbsp;</span><span style="COLOR: rgb(0,0,255)">true</span><span style="COLOR: rgb(0,0,0)">}],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readme:&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;{document.write(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;product&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.product);}<br />&nbsp;&nbsp;&nbsp;&nbsp;};</span></div>
<p><br />&nbsp;&nbsp;&nbsp; JSON的形式就是用大括&ldquo;{}&rdquo;号包括起来的项目列表，每一个项目间并用逗号&ldquo;,&rdquo;分隔，而项目就是用冒号&ldquo;:&rdquo;分隔的属性名和属性值。这是典型的字典表示形式，也再次表明了 JavaScript里的对象就是字典结构。不管多么复杂的对象，都可以被一句JSON代码来创建并赋值。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 其实，JSON就是JavaScript对象最好的序列化形式，它比XML更简洁也更省空间。对象可以作为一个JSON形式的字符串，在网络间自由传递和交换信息。而当需要将这个JSON字符串变成一个JavaScript对象时，只需要使用eval函数这个强大的数码转换引擎，就立即能得到一个 JavaScript内存对象。正是由于JSON的这种简单朴素的天生丽质，才使得她在AJAX舞台上成为璀璨夺目的明星。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;JavaScript就是这样，把面向对象那些看似复杂的东西，用及其简洁的形式表达出来。卸下对象浮华的浓妆，还对象一个眉目清晰！<br /><br /><strong>构造对象</strong><br />&nbsp;<br />&nbsp;&nbsp;&nbsp; 好了，接下我们来讨论一下对象的另一种创建方法。<br /><br />&nbsp;&nbsp;&nbsp; 除JSON外，在JavaScript中我们可以使用new操作符结合一个函数的形式来创建对象。例如：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;MyFunc()&nbsp;{};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">定义一个空函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;anObj&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;MyFunc();&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">使用new操作符，借助MyFun函数，就创建了一个对象</span></div>
<p><br />&nbsp;&nbsp;&nbsp; JavaScript的这种创建对象的方式可真有意思，如何去理解这种写法呢？<br />&nbsp;<br />&nbsp;&nbsp; 其实，可以把上面的代码改写成这种等价形式：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;MyFunc(){};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;anObj&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;{};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">创建一个对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;MyFunc.call(anObj);&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将anObj对象作为this指针调用MyFunc函数</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 我们就可以这样理解，JavaScript先用new操作符创建了一个对象，紧接着就将这个对象作为this参数调用了后面的函数。其实， JavaScript内部就是这么做的，而且任何函数都可以被这样调用！但从 &ldquo;anObj = new MyFunc()&rdquo; 这种形式，我们又看到一个熟悉的身影，C++和C#不就是这样创建对象的吗？原来，条条大路通灵山，殊途同归啊！<br /><br />&nbsp;&nbsp;&nbsp; 君看到此处也许会想，我们为什么不可以把这个MyFunc当作构造函数呢？恭喜你，答对了！JavaScript也是这么想的！请看下面的代码：&nbsp;</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,128,128)">&nbsp;1</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(name)&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">带参数的构造函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;2</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;3</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;name;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将参数值赋给给this对象的属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;4</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;{alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hello,&nbsp;I'm&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name);};&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">给this对象定义一个SayHello方法。</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;5</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;6</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;7</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Employee(name,&nbsp;salary)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">子构造函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;8</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;9</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.call(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">,&nbsp;name);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将this传给父构造函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">10</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.salary&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;salary;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">设置一个this的salary属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">11</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.ShowMeTheMoney&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;{alert(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;$</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.salary);};&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">添加ShowMeTheMoney方法。</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">12</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="COLOR: rgb(0,128,128)">13</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="COLOR: rgb(0,128,128)">14</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;BillGates&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Bill&nbsp;Gates</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">用Person构造函数创建BillGates对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">15</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Employee(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Steve&nbsp;Jobs</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;</span><span style="COLOR: rgb(0,0,0)">1234</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">用Empolyee构造函数创建SteveJobs对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">16</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">17</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">显示：I'm&nbsp;Bill&nbsp;Gates</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">18</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">显示：I'm&nbsp;Steve&nbsp;Jobs</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">19</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.ShowMeTheMoney();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">显示：Steve&nbsp;Jobs&nbsp;$1234</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">20</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">21</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.constructor&nbsp;</span><span style="COLOR: rgb(0,0,0)">==</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person);&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">显示：true</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">22</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;alert(SteveJobs.constructor&nbsp;</span><span style="COLOR: rgb(0,0,0)">==</span><span style="COLOR: rgb(0,0,0)">&nbsp;Employee);&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">显示：true</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">23</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="COLOR: rgb(0,128,128)">24</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">==</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs.SayHello);&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">显示：false</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 这段代码表明，函数不但可以当作构造函数，而且还可以带参数，还可以为对象添加成员和方法。其中的第9行，Employee构造函数又将自己接收的 this作为参数调用Person构造函数，这就是相当于调用基类的构造函数。第21、22行还表明这样一个意思：BillGates是由Person构造的，而SteveJobs是由Employee构造的。对象内置的constructor属性还指明了构造对象所用的具体函数！<br /><br />&nbsp;&nbsp;&nbsp; 其实，如果你愿意把函数当作&ldquo;类&rdquo;的话，她就是&ldquo;类&rdquo;，因为她本来就有&ldquo;类&rdquo;的那些特征。难道不是吗？她生出的儿子各个都有相同的特征，而且构造函数也与类同名嘛！<br /><br />&nbsp;&nbsp;&nbsp; 但要注意的是，用构造函数操作this对象创建出来的每一个对象，不但具有各自的成员数据，而且还具有各自的方法数据。换句话说，方法的代码体(体现函数逻辑的数据)在每一个对象中都存在一个副本。尽管每一个代码副本的逻辑是相同的，但对象们确实是各自保存了一份代码体。上例中的最后一句说明了这一实事，这也解释了JavaScript中的函数就是对象的概念。<br /><br />&nbsp;&nbsp;&nbsp; 同一类的对象各自有一份方法代码显然是一种浪费。在传统的对象语言中，方法函数并不象JavaScript那样是个对象概念。即使也有象函数指针、方法指针或委托那样的变化形式，但其实质也是对同一份代码的引用。一般的对象语言很难遇到这种情况。<br /><br />&nbsp;&nbsp;&nbsp; 不过，JavaScript语言有大的灵活性。我们可以先定义一份唯一的方法函数体，并在构造this对象时使用这唯一的函数对象作为其方法，就能共享方法逻辑。例如：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;SayHello()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">先定义一份SayHello函数代码</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hello,&nbsp;I'm&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(name)&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">带参数的构造函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;name;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">将参数值赋给给this对象的属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;SayHello;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">给this对象SayHello方法赋值为前面那份SayHello代码。</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;BillGates&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Bill&nbsp;Gates</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">创建BillGates对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Steve&nbsp;Jobs</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">创建SteveJobs对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">==</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs.SayHello);&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">显示：true</span></div>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp; 其中，最后一行的输出结果表明两个对象确实共享了一个函数对象。虽然，这段程序达到了共享了一份方法代码的目的，但却不怎么优雅。因为，定义 SayHello方法时反映不出其与Person类的关系。&ldquo;优雅&rdquo;这个词用来形容代码，也不知道是谁先提出来的。不过，这个词反映了程序员已经从追求代码的正确、高效、可靠和易读等基础上，向着追求代码的美观感觉和艺术境界的层次发展，程序人生又多了些浪漫色彩。<br /><br />&nbsp;&nbsp; 显然，JavaScript早想到了这一问题，她的设计者们为此提供了一个有趣的prototype概念。<br /><br /><strong>初看原型</strong><br /><br />&nbsp;&nbsp;&nbsp; prototype源自法语，软件界的标准翻译为&ldquo;原型&rdquo;，代表事物的初始形态，也含有模型和样板的意义。JavaScript中的prototype概念恰如其分地反映了这个词的内含，我们不能将其理解为C++的prototype那种预先声明的概念。<br /><br />&nbsp;&nbsp;&nbsp; JavaScript的所有function类型的对象都有一个prototype属性。这个prototype属性本身又是一个object类型的对象，因此我们也可以给这个prototype对象添加任意的属性和方法。既然prototype是对象的&ldquo;原型&rdquo;，那么由该函数构造出来的对象应该都会具有这个&ldquo;原型&rdquo;的特性。事实上，在构造函数的prototype上定义的所有属性和方法，都是可以通过其构造的对象直接访问和调用的。也可以这么说， prototype提供了一群同类对象共享属性和方法的机制。<br /><br />&nbsp;&nbsp;&nbsp; 我们先来看看下面的代码：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;name;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">设置对象属性，每个对象各自一份属性数据</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">给Person函数的prototype添加SayHello方法。</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hello,&nbsp;I'm&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;BillGates&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Bill&nbsp;Gates</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">创建BillGates对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Steve&nbsp;Jobs</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">创建SteveJobs对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)"><br />&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">通过BillGates对象直接调用到SayHello方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">通过SteveJobs对象直接调用到SayHello方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)"><br />&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">==</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs.SayHello);&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">因为两个对象是共享prototype的SayHello，所以显示：true</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 程序运行的结果表明，构造函数的prototype上定义的方法确实可以通过对象直接调用到，而且代码是共享的。显然，把方法设置到prototype的写法显得优雅多了，尽管调用形式没有变，但逻辑上却体现了方法与类的关系，相对前面的写法，更容易理解和组织代码。<br /><br />&nbsp;&nbsp;&nbsp; 那么，对于多层次类型的构造函数情况又如何呢？<br /><br />&nbsp;&nbsp;&nbsp; 我们再来看下面的代码：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,128,128)">&nbsp;1</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(name)&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">基类构造函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;2</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;3</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;name;<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;4</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;5</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;6</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">给基类构造函数的prototype添加方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;7</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;8</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hello,&nbsp;I'm&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name);<br /></span><span style="COLOR: rgb(0,128,128)">&nbsp;9</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="COLOR: rgb(0,128,128)">10</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="COLOR: rgb(0,128,128)">11</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Employee(name,&nbsp;salary)&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">子类构造函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">12</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="COLOR: rgb(0,128,128)">13</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person.call(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">,&nbsp;name);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">调用基类构造函数</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">14</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.salary&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;salary;<br /></span><span style="COLOR: rgb(0,128,128)">15</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="COLOR: rgb(0,128,128)">16</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="COLOR: rgb(0,128,128)">17</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;Employee.prototype&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person();&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">建一个基类的对象作为子类原型的原型，这里很有意思</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">18</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="COLOR: rgb(0,128,128)">19</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;Employee.prototype.ShowMeTheMoney&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">给子类添构造函数的prototype添加方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">20</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="COLOR: rgb(0,128,128)">21</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;$</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.salary);<br /></span><span style="COLOR: rgb(0,128,128)">22</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;};<br /></span><span style="COLOR: rgb(0,128,128)">23</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">24</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;BillGates&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Bill&nbsp;Gates</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">创建基类Person的BillGates对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">25</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Employee(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Steve&nbsp;Jobs</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;</span><span style="COLOR: rgb(0,0,0)">1234</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">创建子类Employee的SteveJobs对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">26</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">27</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">通过对象直接调用到prototype的方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">28</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">通过子类对象直接调用基类prototype的方法，关注！</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">29</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.ShowMeTheMoney();&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">通过子类对象直接调用子类prototype的方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">30</span>&nbsp;<span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">31</span>&nbsp;<span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;alert(BillGates.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">==</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs.SayHello);&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">显示：true，表明prototype的方法是共享的</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 这段代码的第17行，构造了一个基类的对象，并将其设为子类构造函数的prototype，这是很有意思的。这样做的目的就是为了第28行，通过子类对象也可以直接调用基类prototype的方法。为什么可以这样呢？<br /><br />&nbsp;&nbsp;&nbsp; 原来，在JavaScript中，prototype不但能让对象共享自己财富，而且prototype还有寻根问祖的天性，从而使得先辈们的遗产可以代代相传。当从一个对象那里读取属性或调用方法时，如果该对象自身不存在这样的属性或方法，就会去自己关联的prototype对象那里寻找；如果 prototype没有，又会去prototype自己关联的前辈prototype那里寻找，直到找到或追溯过程结束为止。<br /><br />&nbsp;&nbsp;&nbsp; 在JavaScript内部，对象的属性和方法追溯机制是通过所谓的prototype链来实现的。当用new操作符构造对象时，也会同时将构造函数的 prototype对象指派给新创建的对象，成为该对象内置的原型对象。对象内置的原型对象应该是对外不可见的，尽管有些浏览器(如Firefox)可以让我们访问这个内置原型对象，但并不建议这样做。内置的原型对象本身也是对象，也有自己关联的原型对象，这样就形成了所谓的原型链。<br /><br />&nbsp;&nbsp;&nbsp; 在原型链的最末端，就是Object构造函数prototype属性指向的那一个原型对象。这个原型对象是所有对象的最老祖先，这个老祖宗实现了诸如 toString等所有对象天生就该具有的方法。其他内置构造函数，如Function, Boolean, String, Date和RegExp等的prototype都是从这个老祖宗传承下来的，但他们各自又定义了自身的属性和方法，从而他们的子孙就表现出各自宗族的那些特征。<br /><br />&nbsp;&nbsp;&nbsp; 这不就是&ldquo;继承&rdquo;吗？是的，这就是&ldquo;继承&rdquo;，是JavaScript特有的&ldquo;原型继承&rdquo;。<br /><br />&nbsp;&nbsp;&nbsp; &ldquo;原型继承&rdquo;是慈祥而又严厉的。原形对象将自己的属性和方法无私地贡献给孩子们使用，也并不强迫孩子们必须遵从，允许一些顽皮孩子按自己的兴趣和爱好独立行事。从这点上看，原型对象是一位慈祥的母亲。然而，任何一个孩子虽然可以我行我素，但却不能动原型对象既有的财产，因为那可能会影响到其他孩子的利益。从这一点上看，原型对象又象一位严厉的父亲。我们来看看下面的代码就可以理解这个意思了：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.company&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Microsoft</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">原型的属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">原型的方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hello,&nbsp;I'm&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;of&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.company);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;BillGates&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Bill&nbsp;Gates</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">由于继承了原型的东西，规规矩矩输出：Hello,&nbsp;I'm&nbsp;Bill&nbsp;Gates</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;SteveJobs&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Steve&nbsp;Jobs</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.company&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Apple</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">设置自己的company属性，掩盖了原型的company属性</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">实现了自己的SayHello方法，掩盖了原型的SayHello方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hi,&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;like&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.company&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">,&nbsp;ha&nbsp;ha&nbsp;ha&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SteveJobs.SayHello();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">都是自己覆盖的属性和方法，输出：Hi,&nbsp;Steve&nbsp;Jobs&nbsp;like&nbsp;Apple,&nbsp;ha&nbsp;ha&nbsp;ha&nbsp;</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">SteveJobs的覆盖没有影响原型对象，BillGates还是按老样子输出</span></div>
<p><br />&nbsp;&nbsp;&nbsp; 对象可以掩盖原型对象的那些属性和方法，一个构造函数原型对象也可以掩盖上层构造函数原型对象既有的属性和方法。这种掩盖其实只是在对象自己身上创建了新的属性和方法，只不过这些属性和方法与原型对象的那些同名而已。JavaScript就是用这简单的掩盖机制实现了对象的&ldquo;多态&rdquo;性，与静态对象语言的虚函数和重载(override)概念不谋而合。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;然而，比静态对象语言更神奇的是，我们可以随时给原型对象动态添加新的属性和方法，从而动态地扩展基类的功能特性。这在静态对象语言中是很难想象的。我们来看下面的代码：</p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.SayHello&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">建立对象前定义的方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Hello,&nbsp;I'm&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">this</span><span style="COLOR: rgb(0,0,0)">.name);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)">&nbsp;BillGates&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)">&nbsp;Person(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Bill&nbsp;Gates</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">建立对象</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BillGates.SayHello();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.Retire&nbsp;</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">()&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">建立对象后再动态扩展原型的方法</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">Poor&nbsp;</span><span style="COLOR: rgb(0,0,0)">&quot;</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: r