﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-JAVA EVERY DAY-文章分类-AJAX</title><link>http://www.blogjava.net/xyy198203/category/19118.html</link><description>DAY DAY UP , STUDY HARD</description><language>zh-cn</language><lastBuildDate>Wed, 21 Mar 2007 01:03:47 GMT</lastBuildDate><pubDate>Wed, 21 Mar 2007 01:03:47 GMT</pubDate><ttl>60</ttl><item><title>Prototype学习之初始化和继承</title><link>http://www.blogjava.net/xyy198203/articles/104934.html</link><dc:creator>没有鱼的水</dc:creator><author>没有鱼的水</author><pubDate>Tue, 20 Mar 2007 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/xyy198203/articles/104934.html</guid><wfw:comment>http://www.blogjava.net/xyy198203/comments/104934.html</wfw:comment><comments>http://www.blogjava.net/xyy198203/articles/104934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xyy198203/comments/commentRss/104934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xyy198203/services/trackbacks/104934.html</trackback:ping><description><![CDATA[
		<table width="100%">
				<tbody>
						<tr>
								<td>
										<p>
												<font face="Arial">从 prototype.js 深入学习 javascript 的面向对象特性</font>
										</p>
										<p>
												<font face="Arial">1.怎样构造(初始化)对象?</font>
										</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> Prototype = {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">  Version: '1.5.0_rc1',   </span>
														</li>
														<li class="alt">
																<span twffan="done">  ScriptFragment: '(?:)((\n|\r|.)*?)(?:&lt;\/script&gt;)',   </span>
														</li>
														<li class="">
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done">  emptyFunction: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {},   </span>
														</li>
														<li class="">
																<span twffan="done">  K: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">(x) {</span>
																<span class="keyword" twffan="done">return</span>
																<span twffan="done"> x}   </span>
														</li>
														<li class="alt">
																<span twffan="done">}   </span>
														</li>
												</ol>
										</div>
										<p>就这样，初始化了一个对象(名字就叫 Prototype)，以及对象的四个成员: Version, ScriptFragment, emptyFunction, K</p>
										<p>我们也来试试:</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> bbs = {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done"> name: 'JavaEye',   </span>
														</li>
														<li class="alt">
																<span twffan="done"> version: '2.0',   </span>
														</li>
														<li class="">
																<span twffan="done"> describe: </span>
																<span class="string" twffan="done">"做最棒的软件开发交流区"</span>
																<span twffan="done">,   </span>
														</li>
														<li class="alt">
																<span twffan="done"> sayHello: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() { alert(</span>
																<span class="string" twffan="done">"hello, i'm javaeye! "</span>
																<span twffan="done">) }   </span>
														</li>
														<li class="">
																<span twffan="done">}  </span>
														</li>
												</ol>
										</div>
										<p>于是你可以这样使用： bbs.name 或 bbs.sayHello()</p>
										<p>看到吗？ sayHello 是一个方法哦，不要惊慌，"一切都是对象"，所以它和 name 是一样的，只不过初始化，或定义的语法不一样。想起 js 中的正则表达式中的那两个杆杆了吗？ 可爱吧！</p>
										<p>方法是对象，所以它可以被当作参数传递，或者作为方法的返回值。</p>
										<p>所以 Prototype 中有一个 Version 属性，还有一个匹配 script 的正则式字符串， 一个空方法emptyFunction，还有一个方法 K, 它仅仅返回参数。</p>
										<p>没问题吧，继续！</p>
										<p>2. 构造函数？</p>
										<p>先让我们写段代码吧(中学时，我语文极差(大学没语文了)，我想写代码让你们明白我心里真实的想法)：</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> Person = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">(name) { </span>
																		<span class="comment" twffan="done">// 这里 Person 是一个方法 </span>
																		<span twffan="done">  </span>
																</span>
														</li>
														<li class="">
																<span twffan="done"> </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.name = name;   </span>
														</li>
														<li class="alt">
																<span twffan="done">}   </span>
														</li>
														<li class="">
																<span twffan="done">
																</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> bencode = </span>
																<span class="keyword" twffan="done">new</span>
																<span twffan="done"> Persion(</span>
																<span class="string" twffan="done">"bencode"</span>
																<span twffan="done">);  </span>
																<span class="comment" twffan="done">// 这里像Java吧！ </span>
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done">alert(bencode.name);  </span>
														</li>
												</ol>
										</div>
										<p>先看结果：<br />从 alert(bencode.name); 可以知道，bencode是对象， 而 name 就是 bencode 的属性， 它被正确地初始化为 "bencode"</p>
										<p>所以 var bencode = new Persion("bencode"); 就是构造了一个新的对象，Person() 相当于构造函数</p>
										<p>所以 new 这个关键字， 就是构造一个新的对象，并且在这个对象上调用相应的方法，并将这个对象返回。</p>
										<p>按上面说： 方法 如果用在 在 new 后面，就相当于成了构造函数了。</p>
										<p>话又说回来了， 如果 var bencode = new Persion("bencode") 是 构造了一个对象，像Java, 那么 Person 是不是类呢？<br />可是 Person 不是方法吗？ 可是方法不也是对象吗？ 类也是对象？ </p>
										<p>一切皆对象? </p>
										<p>本来无一物！</p>
										<p>好了，看 prototype.js吧</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> Class = {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">  create: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="alt">
																<span twffan="done">    </span>
																<span class="keyword" twffan="done">return</span>
																<span twffan="done"> </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="">
																<span twffan="done">      </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.initialize.apply(</span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">, arguments);   </span>
														</li>
														<li class="alt">
																<span twffan="done">    }   </span>
														</li>
														<li class="">
																<span twffan="done">  }   </span>
														</li>
														<li class="alt">
																<span twffan="done">}  </span>
														</li>
												</ol>
										</div>
										<p>初始化一个 Class 对象， 它有一个成员，是一个方法， 这个方法返因另一个方法（方法是对象，所以可以作为参数或者返回值）</p>
										<p>所以如果我们这么做： <br /></p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> A = Class.create(); </span>
																		<span class="comment" twffan="done">// 此时 A 是一个方法，方法体，下面解释 </span>
																		<span twffan="done">  </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">
																</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> a = </span>
																<span class="keyword" twffan="done">new</span>
																<span twffan="done"> A(...);  </span>
																<span class="comment" twffan="done">// 对方法使用 new 操作符，就是构造一个新的对象，然后在这个对象上调用这个方法( 现在是 A)</span>
																<span twffan="done">  </span>
														</li>
												</ol>
										</div>
										<p>上面分析说？ A相当于类， 哈哈 Class.create();  // 终于名副其实<br />var a = new A(...);  // 也是相当地直观， 就是构造一个新的对象，类型 是A</p>
										<p>new 操作符构造了对象，并调用了 方法， 这个方法到底做了什么呢？ 也就是上面没有分析的东东，看看先：</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> Class = {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">  create: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="alt">
																<span twffan="done">    </span>
																<span class="keyword" twffan="done">return</span>
																<span twffan="done"> </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {  </span>
																<span class="comment" twffan="done">// 见[1] </span>
																<span twffan="done">  </span>
														</li>
														<li class="">
																<span twffan="done">      </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.initialize.apply(</span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">, arguments);  </span>
																<span class="comment" twffan="done">// 见[2] </span>
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done">    }   </span>
														</li>
														<li class="">
																<span twffan="done">  }    </span>
														</li>
														<li class="alt">
																<span twffan="done">}  </span>
														</li>
												</ol>
										</div>
										<p>[1]. new 操作符，就会在新产生的对象上调用这个方法<br />[2]. 哦？ 这里就是调用 this 对象上的 initialize方法， 并传递 arguments<br />  换句话说，就是把构造的任务委托给 initialize 方法<br />  initialize? 哪里来？ 见下面，类的扩展(继承)<br />  <br />3. prototype?</p>
										<p>看段老代码：<br /></p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> Person = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">(name) {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done"> </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.name = name;   </span>
														</li>
														<li class="alt">
																<span twffan="done">}   </span>
														</li>
														<li class="">
																<span twffan="done">
																</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> bencode = </span>
																<span class="keyword" twffan="done">new</span>
																<span twffan="done"> Person(</span>
																<span class="string" twffan="done">"bencode"</span>
																<span twffan="done">);  </span>
														</li>
												</ol>
										</div>
										<p>bencode不是一个自闭的人，他应该可以向javaeye介绍一下自己。<br />像这样：<br /></p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span twffan="done">bencode.sayHello();   </span>
																</span>
														</li>
												</ol>
										</div>
										<p>
												<br /> <br />假如不能实现以上功能的话， 上面的 new，上面所有的东东都等于垃圾。</p>
										<p>所以。需要给 Person 类加"实例方法"</p>
										<p>题外话： 静态方法如何添加？ 看上面的 Class.create, 仅仅是一个对象的成员而已</p>
										<p>好， 再来一段 (为了完整性，上面的几句话，再抄一次)</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> Person = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">(name) {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done"> </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.name = name;   </span>
														</li>
														<li class="alt">
																<span twffan="done">}   </span>
														</li>
														<li class="">
																<span twffan="done">Person.prototype = {  </span>
																<span class="comment" twffan="done">// protype 是啥? </span>
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done"> sayHello: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="">
																<span twffan="done">  alert(</span>
																<span class="string" twffan="done">"hi, javaeye, I'm "</span>
																<span twffan="done"> + </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.name);   </span>
														</li>
														<li class="alt">
																<span twffan="done"> }   </span>
														</li>
														<li class="">
																<span twffan="done">}   </span>
														</li>
														<li class="alt">
																<span twffan="done">
																</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> bencode = </span>
																<span class="keyword" twffan="done">new</span>
																<span twffan="done"> Person(</span>
																<span class="string" twffan="done">"bencode"</span>
																<span twffan="done">);   </span>
														</li>
														<li class="">
																<span twffan="done">bencode.sayHello();  </span>
														</li>
												</ol>
										</div>
										<p>运行代码，通过！</p>
										<p>prototype是啥？ 请暂时忘记 Prototype(prototype.js) 这个库，名字一样而已！</p>
										<p>让我们再从结果上去分析（第一次我们用这种方法分析而得出了 new 的作用），</p>
										<p>我们在思考：<br /> 要想 bencode.sayHello() 正常运行<br /> bencode 是一个对象, 这是我们已经知道的<br /> sayHello() 应该是 bencode 这个对象的方法才可以<br /> <br /> 可是bencode 这个对象是 new 操作符产生的, 而 new 此时作用于 Person 这个 "类"<br /> 那么， 哦？ 那么有两种可能:<br /> 1. new 产生的那个新对象是不是就是 Person.prototype<br /> 2. Person.prototype 中的成员 将会被 new 操作符添加到 新产生的对象中 </p>
										<p>再看:<br /></p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span twffan="done">Person.prototype = {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done"> sayHello: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="alt">
																<span twffan="done">  alert(</span>
																<span class="string" twffan="done">"hi, javaeye, I'm "</span>
																<span twffan="done"> + </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.name); </span>
																<span class="comment" twffan="done">// 这里有this </span>
																<span twffan="done">  </span>
														</li>
														<li class="">
																<span twffan="done"> }   </span>
														</li>
														<li class="alt">
																<span twffan="done">}  </span>
														</li>
												</ol>
										</div>
										<p>this.name, 这里的 this 指什么？所以第一个可能讲不通呀</p>
										<p>回忆起这段：</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> Person = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">(name) {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done"> </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.name = name;   </span>
														</li>
														<li class="alt">
																<span twffan="done">}  </span>
														</li>
												</ol>
										</div>
										<p>如果这里的 this 代表着新产生的对象的话。<br />那么第二种情况就讲得通了， new 将会把 Person.prototype 这个对象的成员放到 这个新对象中。 与当前行为相符。</p>
										<p>所以： Person 的 prototype 对象中的 成员, 将会被添加到 新产生的对象 中(我是这样理解的)<br />(不知道 Js解释器是不是开源的， 有空我得去看看，怎么实现的。)</p>
										<p>嘿，默认的 prototype 就是 Object 哦！</p>
										<p>4. 扩展？继承？</p>
										<p>什么是扩展？啥是继承？ ! 我从爸爸那得到了什么？<br />想不通！</p>
										<p>还是实际点：</p>
										<p>有一个类A, 它有一个 sayHello方法</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> A = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">() {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">}   </span>
														</li>
														<li class="alt">
																<span twffan="done">  </span>
														</li>
														<li class="">
																<span twffan="done">A.prototype = {   </span>
														</li>
														<li class="alt">
																<span twffan="done"> sayHello: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="">
																<span twffan="done">  alert(</span>
																<span class="string" twffan="done">"sayHello A"</span>
																<span twffan="done">)   </span>
														</li>
														<li class="alt">
																<span twffan="done"> }   </span>
														</li>
														<li class="">
																<span twffan="done">}   </span>
														</li>
												</ol>
										</div>
										<p>我想构造一个 B 类，让他继承 A 对象， 这句话太抽象。 </p>
										<p>其实我们可能想这样：</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> b = </span>
																		<span class="keyword" twffan="done">new</span>
																		<span twffan="done"> B();   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">b.sayHello();  </span>
																<span class="comment" twffan="done">// 调用 A 的 sayHello</span>
																<span twffan="done">  </span>
														</li>
												</ol>
										</div>
										<p>这应该是继承的第一层含义（重用）</p>
										<p>怎么办到呢？</p>
										<p>var B = function() { // 这里是有一个B类了<br />}</p>
										<p>怎么样添加"实例方法"?  快点想起 prototype!!!</p>
										<p>B.prototype = A.prototype</p>
										<p>这样行了吗？ 恭喜, 运行通过！</p>
										<p>让我们整合一次</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> A = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">() {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">}   </span>
														</li>
														<li class="alt">
																<span twffan="done">A.prototype = {   </span>
														</li>
														<li class="">
																<span twffan="done"> sayHello: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="alt">
																<span twffan="done">  alert(</span>
																<span class="string" twffan="done">"sayHello A"</span>
																<span twffan="done">);   </span>
														</li>
														<li class="">
																<span twffan="done"> }   </span>
														</li>
														<li class="alt">
																<span twffan="done">}   </span>
														</li>
														<li class="">
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done">
																</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> B = </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="">
																<span twffan="done">}   </span>
														</li>
														<li class="alt">
																<span twffan="done">B.prototype = A.prototype;   </span>
														</li>
														<li class="">
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done">
																</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> b = </span>
																<span class="keyword" twffan="done">new</span>
																<span twffan="done"> B();   </span>
														</li>
														<li class="">
																<span twffan="done">b.sayHello();    </span>
														</li>
												</ol>
										</div>
										<p>可是如果 B 是这样呢?</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> B = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">() {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">}   </span>
														</li>
														<li class="alt">
																<span twffan="done">B.prototype = {   </span>
														</li>
														<li class="">
																<span twffan="done"> sayHi: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="alt">
																<span twffan="done">  alert(</span>
																<span class="string" twffan="done">"sayHi B"</span>
																<span twffan="done">);   </span>
														</li>
														<li class="">
																<span twffan="done"> }   </span>
														</li>
														<li class="alt">
																<span twffan="done">}  </span>
														</li>
												</ol>
										</div>
										<p>我们是不是应该将 A.prototype 中的内容添加到 B.prototype 对象中，而不是代替它呢？ 当然。</p>
										<p>这样才能"扩展"</p>
										<p>题外话？多态在哪里？ 嘿嘿</p>
										<p>好了，足够多了， 那prototype.js 是怎么样"扩展"的呢？</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span twffan="done">Object.extend = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">(destination, source) {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">  </span>
																<span class="keyword" twffan="done">for</span>
																<span twffan="done"> (</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> property </span>
																<span class="keyword" twffan="done">in</span>
																<span twffan="done"> source) {   </span>
														</li>
														<li class="alt">
																<span twffan="done">    destination[property] = source[property];   </span>
														</li>
														<li class="">
																<span twffan="done">  }   </span>
														</li>
														<li class="alt">
																<span twffan="done">  </span>
																<span class="keyword" twffan="done">return</span>
																<span twffan="done"> destination;   </span>
														</li>
														<li class="">
																<span twffan="done">}  </span>
														</li>
												</ol>
										</div>
										<p>这个只是简单地把 source 的成员， 添加到 destination 对象中嘛, 哪里看得出扩展？</p>
										<p>如果我这样呢？</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> A = </span>
																		<span class="keyword" twffan="done">function</span>
																		<span twffan="done">() {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">}   </span>
														</li>
														<li class="alt">
																<span twffan="done">A.prototype = {   </span>
														</li>
														<li class="">
																<span twffan="done"> sayHello: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="alt">
																<span twffan="done">  alert(</span>
																<span class="string" twffan="done">"sayHello A"</span>
																<span twffan="done">)   </span>
														</li>
														<li class="">
																<span twffan="done"> }   </span>
														</li>
														<li class="alt">
																<span twffan="done">}   </span>
														</li>
														<li class="">
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done">
																</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> B = </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="">
																<span twffan="done">}   </span>
														</li>
														<li class="alt">
																<span twffan="done">Object.extend(B.prototype, A.prototype); </span>
																<span class="comment" twffan="done">// 先添加父类(A)成员 </span>
																<span twffan="done">  </span>
														</li>
														<li class="">
																<span twffan="done">Object.extend(B.prototype, { </span>
																<span class="comment" twffan="done">// 再添加B类成员, 如果是同名，则覆盖，行为符合 "多态" </span>
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done"> sayHi: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="">
																<span twffan="done">  alert(</span>
																<span class="string" twffan="done">"sayHi B"</span>
																<span twffan="done">);   </span>
														</li>
														<li class="alt">
																<span twffan="done"> }   </span>
														</li>
														<li class="">
																<span twffan="done">});   </span>
														</li>
												</ol>
										</div>
										<p>回忆刚才的 Class.create()：</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> Person = Class.create();   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">
																</span>
																<span class="keyword" twffan="done">var</span>
																<span twffan="done"> bencode = </span>
																<span class="keyword" twffan="done">new</span>
																<span twffan="done"> Person(</span>
																<span class="string" twffan="done">"bencode"</span>
																<span twffan="done">);  </span>
														</li>
												</ol>
										</div>
										<p>刚才说过， 调用 new 时， 将会创建一个新对象，并且调用 Person 方法， Person 方法会委托给 "新产生对象"的 initialize方法</p>
										<p>怎么样给新产生对象添加 initialize 方法？ 哈哈，轻松</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span twffan="done">Object.extend(Person.prototype, {   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done"> initialize: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">() {   </span>
														</li>
														<li class="alt">
																<span twffan="done">  </span>
																<span class="keyword" twffan="done">this</span>
																<span twffan="done">.name = name;   </span>
														</li>
														<li class="">
																<span twffan="done"> } </span>
																<span class="comment" twffan="done">//, </span>
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done"> </span>
																<span class="comment" twffan="done">// 下面可以添加其他实例方法。 </span>
																<span twffan="done">  </span>
														</li>
														<li class="">
																<span twffan="done">});  </span>
														</li>
												</ol>
										</div>
										<p>
												<br />所以， 我们使用 prototype 创建类一般格式是这样的：</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> ClassName = Class.create();   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">Object.extend(ClassName.prototype, {   </span>
														</li>
														<li class="alt">
																<span twffan="done"> initialize: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">(...) { </span>
																<span class="comment" twffan="done">// 这就相当于构造函数 </span>
																<span twffan="done">  </span>
														</li>
														<li class="">
																<span twffan="done"> }   </span>
														</li>
														<li class="alt">
																<span twffan="done"> </span>
																<span class="comment" twffan="done">//... </span>
																<span twffan="done">  </span>
														</li>
														<li class="">
																<span twffan="done">});  </span>
														</li>
												</ol>
										</div>
										<p>如果我们要继承一个类，只要：</p>
										<div class="code_title" twffan="done">js 代码</div>
										<div class="dp-highlighter" twffan="done">
												<div class="bar" twffan="done"> </div>
												<ol class="dp-c">
														<li class="alt">
																<span twffan="done">
																		<span class="keyword" twffan="done">var</span>
																		<span twffan="done"> ClassName = Class.create();   </span>
																</span>
														</li>
														<li class="">
																<span twffan="done">Object.extend(ClassName.prototype, SuperClassName.prototype);   </span>
														</li>
														<li class="alt">
																<span twffan="done">Object.extend(ClassName.prototype, {   </span>
														</li>
														<li class="">
																<span twffan="done"> initialize: </span>
																<span class="keyword" twffan="done">function</span>
																<span twffan="done">(...) {   </span>
														</li>
														<li class="alt">
																<span twffan="done"> }   </span>
														</li>
														<li class="">
																<span twffan="done"> </span>
																<span class="comment" twffan="done">//... </span>
																<span twffan="done">  </span>
														</li>
														<li class="alt">
																<span twffan="done">});  </span>
														</li>
												</ol>
										</div>
										<p>面向对象部分基本上就这样。</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/xyy198203/aggbug/104934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xyy198203/" target="_blank">没有鱼的水</a> 2007-03-20 13:20 <a href="http://www.blogjava.net/xyy198203/articles/104934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>