﻿<?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-kangpangpang-文章分类-Javascript</title><link>http://www.blogjava.net/kangpangpang/category/12899.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 10 Mar 2007 16:05:22 GMT</lastBuildDate><pubDate>Sat, 10 Mar 2007 16:05:22 GMT</pubDate><ttl>60</ttl><item><title>IE vs. FireFox 系列 - showModalDialog</title><link>http://www.blogjava.net/kangpangpang/articles/101928.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Mon, 05 Mar 2007 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/101928.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/101928.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/101928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/101928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/101928.html</trackback:ping><description><![CDATA[
		<p>在網頁程式中,<br />有時我們會希望使用者按下按鈕後開啟一個保持在原視窗前方的子視窗,<br />而在IE中,我們可以使用showModalDialog來達成,<br />語法如下 : </p>
		<p>
				<font color="#008000">
						<i>vReturnValue</i> = <i>window</i><b>.showModalDialog(</b><i>sURL</i><b> [</b><b>, </b><i>vArguments</i><b>]</b><b> [</b><b>, </b><i>sFeatures</i><b>]</b><b>)</b></font>
		</p>
		<p>範例:</p>
		<p>
				<font color="#008000">window.showModalDialog("openwin.html","Arguments","dialogHeight: 200px; dialogWidth: 200px; dialogTop: 10px; dialogLeft: 10px; edge: Raised; center: Yes; help: Yes; resizable: Yes; status: Yes;");</font>
		</p>
		<p>但是.在Firefox中卻沒有showModalDialog這東西,<br />而在FireFox中我們只能使用window.open實現這樣的功能,<br />window.open的語法如下 :</p>
		<p>
				<font color="#008000">
						<i>oNewWindow</i> = <i>window</i><b>.open(</b><b> [</b><i>sURL</i><b>]</b><b> [</b><b>, </b><i>sName</i><b>]</b><b> [</b><b>, </b><i>sFeatures</i><b>]</b><b> [</b><b>, </b><i>bReplace</i><b>]</b><b>)</b></font>
		</p>
		<p>只是,在Firefox下,window.open的參數中,sFeature多了一些功能設定,<br />而在FireFox下要讓開啟的視窗跟IE的showModalDialog一樣的話,<br />只要在sFeatures中加個<font color="#ff0000">modal=yes</font>就可以了,<br />範例如下:</p>
		<p>window.open('openwin.html','newWin','modal=yes,width=200,height=200,resizable=no,scrollbars=no');</p>
		<p>提到了子視窗,不得不提的就是子視窗跟母視窗間的交互操作,<br />因為我想很多人開啟對話視窗應該都是為了將操作完的結果丟回去給母視窗...</p>
		<p>如果是用showModalDialog的話,<br />在子視窗中要存取母視窗的函數的話,<br />要注意兩個地方,<br />1.(母視窗中)開啟視窗:</p>
		<p>window.showModalDialog("openwin.html",<font color="#ff0000">self</font>,'modal=yes,width=775,height=700,resizable=no,scrollbars=no');</p>
		<p>在第二個參數(vArguments),改成self.</p>
		<p>2.(子視窗中)調用母視窗的函數:</p>
		<p>
				<font color="#ff0000">window.dialogArguments</font>.ShowMsg(obj.value);</p>
		<p>ShowMsg為母視窗中的函數.</p>
		<p> </p>
		<p>而使用window.open的話,<br />則是要注意一個地方,<br />1.(子視窗中)調用母視窗的函數:</p>
		<p>
				<font color="#ff0000">window.opener</font>.ShowMsg(obj.value);</p>
		<p>使用window.opener去接母視窗的物件.</p>
		<p>如此一來,只要再透過navigator.appName去判斷瀏覽器為何,<br />就可以寫一個IE與FireFox相容的函數...</p>
<img src ="http://www.blogjava.net/kangpangpang/aggbug/101928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2007-03-05 15:35 <a href="http://www.blogjava.net/kangpangpang/articles/101928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>firefox和ie下面读写父窗口的值</title><link>http://www.blogjava.net/kangpangpang/articles/101926.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Mon, 05 Mar 2007 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/101926.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/101926.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/101926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/101926.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/101926.html</trackback:ping><description><![CDATA[父窗口<br />&lt;script type ="text/javascript"&gt;<br />  function open1(){<br />    window.open('child.html',"self1",'modal=yes,width=800,height=600,resizable=no,scrollbars=no');<br />    <br />  } <br />  function test(abc){<br />   alert(abc);<br />   }<br /> &lt;/script&gt; <br />子窗口<br /> function init(){<br />  window.opener.test("abc");<br />  //window.opener["i1"] = "5";<br /> }<br /> &lt;/script&gt; <br /><br />其实主要是通过访问父方法来完成对父窗口属性值得访问<img src ="http://www.blogjava.net/kangpangpang/aggbug/101926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2007-03-05 15:27 <a href="http://www.blogjava.net/kangpangpang/articles/101926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>始终在页面固定位置的层(转)</title><link>http://www.blogjava.net/kangpangpang/articles/96331.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Sat, 27 Jan 2007 15:31:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/96331.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/96331.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/96331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/96331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/96331.html</trackback:ping><description><![CDATA[
		<p>&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;TITLE&gt;始终在页面固定位置的层&lt;/TITLE&gt;<br />&lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html" charset="gb2312"&gt;<br />&lt;/HEAD&gt;<br />&lt;style&gt;<br />&lt;!--<br />.div{<br />position: absolute;<br />border: 2px solid red;<br />background-color: #EFEFEF;<br />line-height:90px;<br />font-size:12px;<br />z-index:1000;<br />}<br />--&gt;<br />&lt;/style&gt;<br />&lt;BODY&gt;<br />&lt;div id="Javascript.Div1" class="div" style="width: 240; height:90" align="center"&gt;正中...&lt;/div&gt;<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />function sc1(){<br />document.getElementById("Javascript.Div1").style.top=document.body.scrollTop+(document.body.clientHeight-document.getElementById("Javascript.Div1").offsetHeight)/2<br />document.getElementById("Javascript.Div1").style.left=document.body.scrollLeft+(document.body.clientWidth-document.getElementById("Javascript.Div1").offsetWidth)/2;<br />}<br />&lt;/SCRIPT&gt;</p>
		<p>
				<br />&lt;div id="Javascript.Div2" class="div" style="width: 240; height:90;" align="center"&gt;左上...&lt;/div&gt;<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />function sc2(){<br />document.getElementById("Javascript.Div2").style.top=document.body.scrollTop<br />document.getElementById("Javascript.Div2").style.left=document.body.scrollLeft;<br />}<br />&lt;/SCRIPT&gt;</p>
		<p>&lt;div id="Javascript.Div3" class="div" style="width: 240; height:90;" align="center"&gt;左下...&lt;/div&gt;<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />function sc3(){<br />document.getElementById("Javascript.Div3").style.top=document.body.scrollTop+document.body.clientHeight-document.getElementById("Javascript.Div3").offsetHeight;<br />document.getElementById("Javascript.Div3").style.left=document.body.scrollLeft;<br />}<br />&lt;/SCRIPT&gt;</p>
		<p>&lt;div id="Javascript.Div4" class="div" style="width: 240; height:90;" align="center"&gt;右上...&lt;/div&gt;<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />function sc4(){<br />document.getElementById("Javascript.Div4").style.top=document.body.scrollTop;<br />document.getElementById("Javascript.Div4").style.left=document.body.scrollLeft+document.body.clientWidth-document.getElementById("Javascript.Div4").offsetWidth;<br />}<br />&lt;/SCRIPT&gt;</p>
		<p>&lt;div id="Javascript.Div5" class="div" style="width: 240; height:90;" align="center"&gt;右下...&lt;/div&gt;<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />function sc5(){</p>
		<p>document.getElementById("Javascript.Div5").style.top=document.body.scrollTop+document.body.clientHeight-document.getElementById("Javascript.Div5").offsetHeight;<br />document.getElementById("Javascript.Div5").style.left=document.body.scrollLeft+document.body.clientWidth-document.getElementById("Javascript.Div5").offsetWidth;;<br />}<br />&lt;/SCRIPT&gt;</p>
		<p>
				<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />&lt;!--<br />function scall(){<br />sc1();sc2();sc3();sc4();sc5();<br />}<br />window.onscroll=scall;<br />window.onresize=scall;<br />window.onload=scall;<br />//--&gt;<br />&lt;/SCRIPT&gt;<br />&lt;div style="position: absolute; top: 0; left: 0; width: 10000; height: 4000;"&gt;&lt;/div&gt;<br />&lt;/BODY&gt;<br />&lt;/HTML&gt;</p>
<img src ="http://www.blogjava.net/kangpangpang/aggbug/96331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2007-01-27 23:31 <a href="http://www.blogjava.net/kangpangpang/articles/96331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>html中校验之影响</title><link>http://www.blogjava.net/kangpangpang/articles/94704.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Thu, 18 Jan 2007 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/94704.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/94704.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/94704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/94704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/94704.html</trackback:ping><description><![CDATA[在没有&lt;!DOCTYPE的时候,一些系统属性比如<br />document.body.scrollTop,document.body.clientHeight,等属性可以取到正常值<br />但是当加上&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "<a href="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd</a>"&gt;<br />&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>"&gt;<br />进行限定的时候，这些属性值的取法转换成以下方式<br />困惑了一天，终于找到了取不到这些值的方法阿。<br />document.documentElement.clientHeigh,<br />document.documentElement.clientHeight<br /><img src ="http://www.blogjava.net/kangpangpang/aggbug/94704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2007-01-18 17:09 <a href="http://www.blogjava.net/kangpangpang/articles/94704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Prototype Documentation List（转载）</title><link>http://www.blogjava.net/kangpangpang/articles/57364.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Sun, 09 Jul 2006 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/57364.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/57364.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/57364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/57364.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/57364.html</trackback:ping><description><![CDATA[Prototype 项目自身缺少文档，但是伴随着Prototype在Ajax项目开发过程的深入使用，越来越多的开发者整理出了自己的文档，为了促进Prototype框架的进一步使用，网站<img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><span class="nobr"><a href="http://www.prototypedoc.com/"><strong><font color="#003366">http://www.prototypedoc.com/</font></strong></a></span>最近整理了一系列关于该项目使用和讨论的站点，详细列表如下： 
<p class="paragraph"><b class="bold">1</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://www.sergiopereira.com/articles/prototype.js.html" target="_blank"><strong><font color="#003366">Developer Notes for prototype.js(sergiopereira.com)</font></strong></a></span></p><p class="paragraph"><b class="bold">2</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://particletree.com/features/quick-guide-to-prototype/" target="_blank"><strong><font color="#003366">Quick Guide to Prototype(particletree.com)</font></strong></a></span></p><p class="paragraph"><b class="bold">3</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://particletree.com/notebook/prototype-and-the-this-keyword/" target="_blank"><strong><font color="#003366">Prototype And The This Keyword (particletree.com)</font></strong></a></span></p><p class="paragraph"><b class="bold">4</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://blogs.ebusiness-apps.com/jordan/pages/Prototype%20Library%20Info.htm" target="_blank"><strong><font color="#003366">Overview of the Prototype Javascript Library (ebusiness-apps.com)</font></strong></a></span></p><p class="paragraph"><b class="bold">5</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://wiki.script.aculo.us/scriptaculous/show/Prototype" target="_blank"><strong><font color="#003366">Prototype in script.aculo.us Wiki (wiki.script.aculo.us)</font></strong></a></span></p><p class="paragraph"><b class="bold">6</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://24ways.org/advent/easy-ajax-with-prototype" target="_blank"><strong><font color="#003366">Easy Ajax with Prototype (24ways.org)</font></strong></a></span></p><p class="paragraph"><b class="bold">7</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://encytemedia.com/blog/articles/2005/12/07/prototype-meets-ruby-a-look-at-enumerable-array-and-hash" target="_blank"><strong><font color="#003366">A Look at Enumerable, Array and Hash (encytemedia.com)</font></strong></a></span></p><p class="paragraph"><b class="bold">8</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://encytemedia.com/blog/articles/2006/02/08/working-with-events-in-prototype" target="_blank"><strong><font color="#003366">Working With Events In Prototype (encytemedia.com)</font></strong></a></span></p><p class="paragraph"><b class="bold">9</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://www.snook.ca/archives/000531.php" target="_blank"><strong><font color="#003366">Prototype Dissected (snook.ca)</font></strong></a></span></p><p class="paragraph"><b class="bold">10</b><span class="nobr"><img alt="&gt;&gt;" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border="0" /><a href="http://www.sitepoint.com/article/painless-javascript-prototype" target="_blank"><strong><font color="#003366">Painless JavaScript Using Prototype (sitepoint.com)</font></strong></a></span></p><p class="paragraph"><a title="链接到start/2006-03-01/1" href="http://ajaxcn.org/space/start/2006-03-01/1"><img alt="PermaLink" src="http://ajaxcn.org/theme/images/Icon-Permalink.png" border="0" /></a></p><img src ="http://www.blogjava.net/kangpangpang/aggbug/57364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2006-07-09 18:20 <a href="http://www.blogjava.net/kangpangpang/articles/57364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>每个Web开发者应该深谙的JavaScript规则(转载)</title><link>http://www.blogjava.net/kangpangpang/articles/57361.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Sun, 09 Jul 2006 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/57361.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/57361.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/57361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/57361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/57361.html</trackback:ping><description><![CDATA[
		<p class="paragraph">alex此举是为了给自己即将出版的新书做个预告，但短短几句总结性的称述提炼出了JavaScript的核心设计概念及编程思想，不可谓不精粹。当我看到这几句话时，暗下思考，再查查犀牛书，才知道自诩精通js的我其实尚是一知半解。以下便来谈谈我对这几句话的重新认识： 
</p>
		<ul class="star">
				<li>
						<b class="bold">JavaScript里一切皆是对象，包括函数。(Everything in JavaScript is an Object. Even functions)</b>
				</li>
		</ul>"一切皆是对象"是一个诡辩的句子，从不同的角度此句可有不同的解释。所以java也号称是完全面向对象的语言。但是我以为alex这里所指的并非语义上的理解，而是从语法的角度。所以这一句应该理解为—— 在JavaScript语言中，操作的一切都是对象。 
<p class="paragraph">我原来以为JavaScript 既然名为 (Java)Script，自然也是继承Java语言的设计————在Java中，数据类型分为基本数据类型(number，boolean，char等)和对象数据类型————而其实JavaScript所操作的数据类型都是对象，类似于Ruby。怎么理解呢？ 例如，整型和布尔值在Java代码中是一个基本数据类型，它是没有方法和属性的，在JavaScript中是怎样呢？ 看如下的代码: </p><div class="code"><pre>//画蛇添足的方法，仅作为example
<span class="java-object">Number</span>.prototype.abs = function() {
    <span class="java-keyword">return</span><span class="java-object">Math</span>.abs(<span class="java-keyword">this</span>); 
}
alert((-100).abs());  // 弹出返回值 100
<span class="java-object">Boolean</span>.prototype.reverse = function() {
    <span class="java-keyword">return</span> !<span class="java-keyword">this</span>;
}
alert(<span class="java-keyword">true</span>.reverse());  // 弹出返回值 <span class="java-keyword">false</span></pre></div>所以， "-100" 和 "true" 在JavaScript中竟然是作为对象来处理的，JavaScript代码中出现的所谓基本数据类型其实都是其Wrapper对象(Number, Boolean等)的直接量，JavaScript在处理它们时实际上是在操作它们的Wrapper对象。从语法上来说，JavaScript是比Java更面向对象的语言。 
<p class="paragraph">alex更强调在JavaScript中函数也是对象，这是动态脚本语言的重要特性(作为对比，在Java中函数(方法)只是一种语法)。函数成为一个对象，所以函数完全可以看作数据:赋给变量、设为对象的属性、甚至作为其他函数的参数。函数是对象带来了巨大的灵活性，也是JavaScript面向对象编程的设计核心之一。当然与之而来的复杂性，也让JavaScript倍受误解。 
</p><ul class="star"><li><b class="bold">所有对象都是可变的。(Every object is always mutable )</b></li></ul>此句还好理解，因为JavaScript中虽然有 <b class="bold">final</b> 保留字，但并没有提供语法上的实现。所以JavaScript中无法定义一个变量是不可变的。另外一个重要理解就是，JavaScript的对象在创建后可以随意添加或删除属性和方法。 
<ul class="star"><li><b class="bold">"." 操作符等同于"[]"操作符。(The dot operator is equivalent to de-referencing by hash (e.g., foo.bar === foo["bar"]) )</b></li></ul>此句也是针对JavaScript的对象而言。对象的属性可以用"."加标识符"bar"来存取，也可以使用"[]"配合标识符的字符串形式来存取。这样就给存取对象属性带来了灵活性————可以动态构造一个字符串并以它来存取对象的属性。此句也揭示了:在JavaScript中数组就是对象，对象本质上就是一个关联数组。 
<ul class="star"><li><b class="bold">new 关键字实际上是先创建一个对象，再让构造器方法在该对象域中执行。The new keyword creates an object that class constructors run inside of, thereby imprinting them </b></li></ul>此句有些难理解，以一个简单的构造器函数举例： 
<div class="code"><pre>function Dog(name) {
	<span class="java-keyword">this</span>.name = name;
}
<span class="java-keyword">var</span> dog = <span class="java-keyword">new</span> Dog(<span class="java-quote">"小明"</span>);</pre></div><p class="paragraph">我以我的理解模拟 new 操作符的执行步骤： </p><div class="code"><pre><span class="java-keyword">var</span> dog = <span class="java-keyword">new</span><span class="java-object">Object</span>(); //首先创建一个新的Object对象
dog.prototype = Dog.prototype; // 设置构造器函数的原型对象为 dog 的原型对象
Dog.apply(dog, argumens);  //将新对象传递给构造函数，此时构造函数可以用this来初始化新对象</pre></div><p class="paragraph">所以 javascript 并非象java/C++的构造器函数那样，先执行然后返回一个对象。而是先创建一个未定义属性的干净的Object对象，接着把构造器函数的原型对象设置为新对象的原型对象(构造器函数的原型对象是JavaScript自动为每个函数创建的)。最后再把这个对象交给构造器函数，在构造器函数中设置该对象其他的属性和方法等等。 
</p><p class="paragraph">通过这样的方式带来的巨大动态特性就是， 可以象操作普通函数一样操作构造器函数。__所有自定义的对象甚至可以使用同一个构造器函数__ 。实际上这也是Prototype和Dojo的核心设计思想。通过这样的方式和原型对象的设计，JavaScript实现了与Java完全不同的面向对象设计。 
</p><ul class="star"><li><b class="bold">所有函数都是闭句。(Functions are always closures (combine w/ previous rule to create OOP) </b>) </li></ul>闭句在我的理解中就是函数和其定义时的上下文快照(作用域)关联在一起。然后函数执行的时候，所有变量都在快照中获取。犀牛书上的专业阐述是这样的: 
<blockquote class="quote">闭包是一个把函数定义和作用域联合在一起的对象...执行函数时使用的是在定义它们时就有效的作用域链，而不是在执行它们时才有效的作用域链...实际上所有函数都是闭包实现的… </blockquote><p class="paragraph">顺从这样的理解：任何函数都有作用域，客户端编程中顶层的全局域函数也是有作用域的，那就是window对象，所以全局函数也就是全局域和函数定义组合的闭包。 
</p><p class="paragraph">Alex说此句是JavaScript面向对象编程的重要规则，我就还不能完全参透了。暂时的理解就是如下代码所示： </p><div class="code"><pre>function Dog(name) {
    <span class="java-keyword">var</span> name = name;
    function getName() {
        <span class="java-keyword">return</span> name;
    }
    <span class="java-keyword">this</span>.getName = getName;
}
<span class="java-keyword">var</span> dog = <span class="java-keyword">new</span> Dog(<span class="java-quote">"小明"</span>);
alert(dog.name);  // 弹出<span class="java-quote">"undefined"</span>
alert(dog.getName()); // 弹出<span class="java-quote">"小明"</span></pre></div>以上代码中闭句的作用就是让 name 成为了Dog的私有属性，只能通过指定的 getName 方法去获取name。类似于 Java 的 JavaBean。 
<ul class="star"><li><b class="bold">this关键字关联于执行时的作用域，而非定义时的作用域。(The this keyword is relative to the execution context, not the declaration context )</b></li></ul>此句似乎和上句关于”函数是闭包“的描述相反。但确是好理解的，一个函数中如果出现 <b class="bold">this</b> 关键字，那么这个 <b class="bold">this</b> 引用的对象就是调用这个函数的对象。也可以通过JavaScript中函数对象提供的apply和call方法来指定 <b class="bold">this</b> 引用的对象。这样的设计使得一个函数可以被分配给很多对象作为其方法，大大提高了复用性。Prototype中的bind方法及Dojo的dojo.lang.hitch方法都是利用了此规则。 
<ul class="star"><li><b class="bold">原型对象的属性也是可变的(The prototype property is mutable )</b></li></ul>此句算是对第二句的补充，JavaScript中每个对象类型(就是构造器函数)都有原型对象，我们可以在任何时候任意改变原型对象的属性，而且这个改变将影响已经通过new操作符实例化的对象和将来会实例化的对象。 
<p class="paragraph">我要感谢这篇短文，它促使我又认真的读了一遍犀牛书的相关章节，同时也有了新的认识和心得。感受正如alex最后所说： 
</p><p class="paragraph"></p><blockquote class="quote">If all of that makes sense to you, JavaScript can be a fun, liberating experience. If not, it’s going to be a world of pain and broken expectations as you shed the baggage of less dynamic languages. </blockquote><img src ="http://www.blogjava.net/kangpangpang/aggbug/57361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2006-07-09 17:58 <a href="http://www.blogjava.net/kangpangpang/articles/57361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>firebug使用指南</title><link>http://www.blogjava.net/kangpangpang/articles/57306.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Sat, 08 Jul 2006 17:07:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/57306.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/57306.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/57306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/57306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/57306.html</trackback:ping><description><![CDATA[
		<p>1.console.log();<br />相当于alert();不过结果输出到firebug控制台，终于不用一次一次点击提示框了阿！<br />2.console.log("this one %s and this second %s",a,b);<br />相当于alert("this one"+a+"and this second"+b);<br />3.console.info();console.warn();console.error();<br />分别在输出信息前面加上不同的警示标志<br />4.debugger;<br />类似于单步调试<br />5.console.time("do this");console.timeEnd("do time");<br />测试没有成功不知道为什么啊</p>
<img src ="http://www.blogjava.net/kangpangpang/aggbug/57306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2006-07-09 01:07 <a href="http://www.blogjava.net/kangpangpang/articles/57306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript in Ten Minutes(转载)</title><link>http://www.blogjava.net/kangpangpang/articles/57303.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Sat, 08 Jul 2006 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/57303.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/57303.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/57303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/57303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/57303.html</trackback:ping><description><![CDATA[
		<h2>Javascript in Ten Minutes</h2>
		<div class="page">
				<h2>Breakdown...</h2>
				<h3>Basic Types</h3>
				<pre>var intValue = 1;
var floatValue = 3.0;
var stringValue = "This is a string\n";
var sqString = 'This is also a string';
</pre>
				<p>Javascript is a dynamically typed language. Variables are declared with the keyword <tt>var</tt>. Common simple types are supported.</p>
				<h3>Arrays</h3>
				<pre>var emptyList = [];
var homogenousList = [1, 2, 3];
var heterogenousList = ["one", 2, 3.0];
</pre>
				<p>Javascript has built-in collection objects. The Array object is a dynamically typed sequence of Javascript values. They are created with the bracket notation <tt>[]</tt> or with the <tt>new</tt> operator on the <tt>Array</tt> object (e.g. <tt>new Array(5)</tt>).</p>
				<h3>Property Maps</h3>
				<pre>var emptyMap = {};
var homogenousMap = {"one": 1, "two": 2, "three": 3};
var heterogenousMap = {"one": 1,
                       "two": "two",
                       "three": 3.0};
</pre>
				<p>Along with <tt>Array</tt>s are the <tt>Object</tt> objects. They act as property maps with strings serving as keys to dynamically typed data.</p>
				<h4>Access</h4>
				<pre>// Dot notation property access
window.alert("Homogenous map property \"one\" "
             + <font color="blue">homogenousMap.one</font>);
// Subscript notation property access
window.alert("Homogenous map property \"two\" "
             + <font color="blue">homogenousMap["two"]</font>);
</pre>
				<h4>Assignment</h4>
				<pre>homogenousMap["one"] = 10;
homogenousMap.two = 20;
</pre>
				<h4>Removal</h4>
				<pre>delete homogenousMap["one"];
delete homogenousMap.two;
</pre>
				<h4>Iteration</h4>
				<pre>for (var <font color="green">key</font> in <font color="blue">heterogenousMap</font>) {
    window.alert("Heterogenous map property \""
                 + <font color="green">key</font>
                 + "\" = "
                 + <font color="blue">heterogenousMap[<font color="green">key</font>]</font>);
}
</pre>
				<h3>Functions</h3>
				<pre>var callable = function (message) { // &lt;-- notice assignment
    window.alert("Callable called with message = "
                 + message);
}


function createClosure(initial) {
    var res = function () {
        initial = initial + 1;
        window.alert("Closure with modified state "
                     + initial);
    }
    return res;
}

function callCallable(f, x) {
    f(x);
}

function composeCallables(f, g, x) {
    f(g(x));
}

</pre>
				<p>Functions are first-class objects. That means that they can be created dynamically, stored, passed and returned just like any other value.</p>
				<h3>Objects</h3>
				<pre>function MyObject(name, value) {
    this.name = name;
    this.value = value;
}
</pre>
				<p>Javascript supports prototype based object orientation. Not a class type but an object constructor is created for new objects with particular properties. In the example above the <tt>this</tt> keyword used to reference the ''current instance'' of the object. The <tt>this</tt> object is essentially a property map with members accessed (and initialized) in this example with the dot notation.</p>
				<p>The object constructor, <tt>MyObject</tt>, is an object constructor not in how it's defined, which looks like any other Javascript function, but in how it's ''invoked''.</p>
				<pre>    var my = new MyObject("foo", 5);
</pre>
				<p>The <tt>new</tt> operator before the function invokes the function with a newly construced object as <tt>this</tt> and returns that the initialized object.</p>
				<h4>Object Prototype</h4>
				<p>Part of what makes a language object oriented is that data not only has properties but also ''behaviors''. Also known as: member functions; methods; and object messages. To implement a member function in Javascript one would be tempted to write something like what's below based on the member initialization exampled above.</p>
				<p>
						<font color="red">
						</font>
				</p>
				<pre>function BadObject(data) {
    this.data = data
    this.memberFunction = function () {
        // ...functions on data...
    }
}
</pre>
				<p>While the code above will work without error, it does create a new closure for each member function for each new instance of the object. What's really required is a class level function that works on instance data. But remember, Javascript objects aren't class based but prototype based. So how do we implement "class" level member functions? (<a class="internal new" href="http://javascript.infogami.com/#Member_Function_Implementation"><font color="#990044">Skip to Implementation</font></a>) Better yet, how do we implement "class" level members functions in general?</p>
				<p>Enter the <tt>prototype</tt> member.</p>
				<p>The internal object member, <tt>prototype</tt>, has language defined significance in that it is used for resolving property names if the property isn't found in the current property map. It's considered internal because, while the instance's <tt>prototype</tt> member is ''inherited'' from the ''constructor's'' <tt>prototype</tt> member, it cannot be accessed directly from the object instance itself. The defined <tt>prototype</tt> member is a property map itself which holds members for property name resolution. Consider the example below:</p>
				<pre> var parentPropertyMap = {<font color="red">"bar"</font>: <font color="red">"I'm the bar"</font>};

 <font color="#00e0">// Define the constructor with inheritable properties</font>
 function ChildObject(foo) {
     this.<font color="blue">foo</font> = foo;
 }
 ChildObject.prototype = parentPropertyMap;

 childPropertyMap1 = new ChildObject(<font color="blue">"I'm the foo1"</font>);
 childPropertyMap2 = new ChildObject(<font color="blue">"I'm the foo2"</font>);

 <font color="#00e0">// Prints "childPropertyMap1.foo = I'm the foo1"</font>
 window.alert("childPropertyMap1.foo = " + childPropertyMap1.<font color="blue">foo</font>);

 <font color="#00e0">// Prints "childPropertyMap2.foo = I'm the foo2"</font>
 window.alert("childPropertyMap2.foo = " + childPropertyMap2.<font color="blue">foo</font>);

 <font color="#00e0">// Prints "childPropertyMap1.bar = I'm the bar"</font>
 window.alert("childPropertyMap1.bar = " + childPropertyMap1.<font color="red">bar</font>);

 <font color="#00e0">// Prints "childPropertyMap2.bar = I'm the bar"</font>
 window.alert("childPropertyMap2.bar = " + childPropertyMap2.<font color="red">bar</font>);
</pre>
				<p>The member <tt>foo</tt> is an instance member added to the instance's property map during construction:</p>
				<pre> function ChildObject(foo) {
     <font color="blue">this.foo = foo;</font>
 }
</pre>
				<p>while <tt>bar</tt> is in the constructor's <tt>prototype</tt>:</p>
				<pre> var parentPropertyMap = {"bar": "I'm the bar"};
 ...
 ChildObject.prototype = parentPropertyMap;
</pre>
				<p>which is ''inherited'' during the <tt>new</tt> operation:</p>
				<pre> childPropertyMap1 = new ChildObject("I'm the foo1");
 childPropertyMap2 = new ChildObject("I'm the foo2");
</pre>
				<p>In other words, the member, <tt>bar</tt>, is shared across all instances of <tt>ChildObject</tt>.</p>
				<p>Therefore, by implementing the <tt>prototype</tt> member of the constructor function, we can think of the constructor function itself as the "class" object. Complete with static class functions:</p>
				<pre> function ClassObject() {}
 ClassObject.staticClassFunction = function(x) {
     return x * 2;
 }
</pre>
				<p>static class variables:</p>
				<pre> function ClassObject() {}
 ClassObject.staticClassVariable = 5;
</pre>
				<p>shared member variables:</p>
				<pre> function ClassObject() {}
 ClassObject.prototype.sharedMember = 5;
</pre>
				<p>and of course, shared member functions:</p>
				<pre> function ClassObject(x) {
     this.x = x;
 }
 ClassObject.prototype.memberFunction = function(x) {
     return x * this.x;
 }
</pre>
				<h4>Member Function Implementation</h4>
				<pre>function Message(message) {
    this.message = message;
}

Message.prototype.show = function() {
    window.alert("Message.show() with message = "
                 + this.message);
}
</pre>
				<p>(<a class="internal" href="http://javascript.infogami.com/Javascript_Objects"><font color="#0055ff">More on Classes and Objects</font></a>)</p>
				<h2>Example Code</h2>
				<pre>//////////////////////////////////////
// Basic Types
var intValue = 1;
var floatValue = 3.0;
var stringValue = "This is a string\n";

///////////////////////////////////////
// Array
var emptyList = [];
var homogenousList = [1, 2, 3];
var heterogenousList = ["one", 2, 3.0];

///////////////////////////////////////
// Property Map
//
var emptyMap = {};
var homogenousMap = {"one": 1, "two": 2, "three": 3};
var heterogenousMap = {"one": 1,
                       "two": "two",
                       "three": 3.0};

///////////////////////////////////////
// Functions as values
//
var callable = function (message) { // &lt;-- notice assignment
    window.alert("Callable called with message = "
                 + message);
}

function createClosure(initial) {
    var res = function () {
        initial = initial + 1;
        window.alert("Closure with modified state "
                     + initial);
    }
    return res;
}

///////////////////////////////////////
// Functions as arguments
//
function callCallable(f, x) {
    f(x);
}

function composeCallables(f, g, x) {
    f(g(x));
}

///////////////////////////////////////
// Objects
//
function MyObject(name, value) {
    this.name = name;
    this.value = value;
}

///////////////////////////////////////
// Objects with Member Functions
//
function Message(message) {
    this.message = message;
}

Message.prototype.show = function() {
    window.alert("Message.show() with message = "
                 + this.message);
}

///////////////////////////////////////
// Demo Utilities
//
function quote(message) {
    return "\"" + message + "\"";
}

///////////////////////////////////////
// HTML Invoked demonstration
// 
//
function main() {
    window.alert("Integer = " + intValue);
    window.alert("Float = " + floatValue);
    window.alert("String = " + stringValue);

    for (var item in emptyList) {
        window.alert("Empty list item = " + item);
    }

    // Script style index iteration
    for (var i in homogenousList) {
        window.alert("Homogenous list item = "
                     + homogenousList[i]);
    }

    // C style index iteration
    for (var i=0; i &lt; heterogenousList.length; ++i) {
        window.alert("Heterogenous list item = "
                     + heterogenousList[i]);
    }

    // Dot notation property access
    window.alert("Homogenous map property \"one\" "
                 + homogenousMap.one);
    // Subscript notation property access
    window.alert("Homogenous map property \"two\" "
                 + homogenousMap["two"]);

    for (var key in heterogenousMap) {
        window.alert("Heterogenous map property \""
                     + key
                     + "\" = "
                     + heterogenousMap[key]);
    }

    callable("(Function value invoked)");
    closure();
    closure();

    callCallable(closure);
    composeCallables(callable, quote, "My Message");

    var my = new MyObject("foo", 5);
    window.alert("MyObject my.name = " + my.name);
    window.alert("MyObject my[\"value\"] = " + my["value"]);

    var msg = new Message("bar");
    for (var key in Message.prototype) {
        window.alert("Message prototype member \""
                     + key
                     + "\" = "
                     + Message.prototype[key]);
    }

    window.alert("Message msg.message = " + msg.message);
    msg.show();
}
</pre>
		</div>
<img src ="http://www.blogjava.net/kangpangpang/aggbug/57303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2006-07-09 00:36 <a href="http://www.blogjava.net/kangpangpang/articles/57303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>w3cDOM vs innerHTML （转载）</title><link>http://www.blogjava.net/kangpangpang/articles/57291.html</link><dc:creator>小熊泡泡</dc:creator><author>小熊泡泡</author><pubDate>Sat, 08 Jul 2006 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/kangpangpang/articles/57291.html</guid><wfw:comment>http://www.blogjava.net/kangpangpang/comments/57291.html</wfw:comment><comments>http://www.blogjava.net/kangpangpang/articles/57291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangpangpang/comments/commentRss/57291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangpangpang/services/trackbacks/57291.html</trackback:ping><description><![CDATA[w3cdom1:创建所有需要的元件<br /><br /><pre>var x = document.createElement('table');
var y = x.appendChild(document.createElement('tbody'));
for (var i=0;i&lt;50;i++)
{
var z = y.appendChild(document.createElement('tr'));
for (var j=0;j&lt;50;j++)
{
var a = z.appendChild(document.createElement('td'));
a.appendChild(document.createTextNode('*'));
}
}
document.getElementById('writeroot').appendChild(x);
</pre><br /><br /><br />w3cdom2：只在第一次的时候创建，以后再需要就clone<br /><pre>var x = document.createElement('table');
var y = x.appendChild(document.createElement('tbody'));
var tr = document.createElement('tr');
var td = document.createElement('td');
var ast = document.createTextNode('*');
for (var i=0;i&lt;50;i++)
{
var z = y.appendChild(tr.cloneNode(true));
for (var j=0;j&lt;50;j++)
{
var a = z.appendChild(td.cloneNode(true));
a.appendChild(ast.cloneNode(true));
}
}
document.getElementById('writeroot').appendChild(x);
</pre><br /><br /><br />tableMethods: 使用W3C DOM的表格方法<br /><pre>var x = document.createElement('table');
var y = x.appendChild(document.createElement('tbody'));
for (var i=0;i&lt;50;i++)
{
var z = y.insertRow(0);
for (var j=0;j&lt;50;j++)
{
var a = z.insertCell(0).appendChild(document.createTextNode('*'));
}
}
document.getElementById('writeroot').appendChild(x);
</pre><br /><br /><br />innerHTML1: 把一串字符串连接起来<br /><pre>var string = '&lt;table&gt;&lt;tbody&gt;';
for (var i=0;i&lt;50;i++)
{
string += '&lt;tr&gt;';
for (var j=0;j&lt;50;j++)
{
string += '&lt;td&gt;*&lt;/td&gt;';
}
string += '&lt;/tr&gt;';
}
string += '&lt;/tbody&gt;&lt;/table&gt;';
document.getElementById('writeroot').innerHTML = string;
</pre><br /><br /><br />innerHTML2: 把字符串push到数组里，再把数组串成一个字符串<br /><pre>var string = new Array();
string.push('&lt;table&gt;&lt;tbody&gt;');
for (var i=0;i&lt;50;i++)
{
string.push('&lt;tr&gt;');
for (var j=0;j&lt;50;j++)
{
string.push('&lt;td&gt;*&lt;/td&gt;');
}
string.push('&lt;/tr&gt;');
}
string.push('&lt;/tbody&gt;&lt;/table&gt;');
var writestring = string.join('');
document.getElementById('writeroot').innerHTML = writestring;
</pre><br /><br /><br />从原文网站上的数据来看，最后一种方法是最快的，前两种w3c的东东在IE/Win里不是一般的慢的。不过最快的方法在IE5/Win和IE5.x/Mac里不支持，需要一个<a href="http://www.quirksmode.org/quirksmode.js" target="_blank">quirksmode.js</a>来让它间接的支持。<br />看了原文，除了了解这些方法的速度外，还了解了这几种不同的方法，算是一点点收获吧。<br /><br /><br />PS：innerHTML不是标准，不过好像目前的浏览器都支持的说。<img src ="http://www.blogjava.net/kangpangpang/aggbug/57291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangpangpang/" target="_blank">小熊泡泡</a> 2006-07-08 22:32 <a href="http://www.blogjava.net/kangpangpang/articles/57291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>