﻿<?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-dreamzqy29-随笔分类-javascript </title><link>http://www.blogjava.net/dreamzqy29/category/23392.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 17 Jun 2007 10:52:11 GMT</lastBuildDate><pubDate>Sun, 17 Jun 2007 10:52:11 GMT</pubDate><ttl>60</ttl><item><title>javascript 面向对象特性与编程实现</title><link>http://www.blogjava.net/dreamzqy29/archive/2007/06/17/124819.html</link><dc:creator>黑夜ちつ独行者</dc:creator><author>黑夜ちつ独行者</author><pubDate>Sun, 17 Jun 2007 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/dreamzqy29/archive/2007/06/17/124819.html</guid><wfw:comment>http://www.blogjava.net/dreamzqy29/comments/124819.html</wfw:comment><comments>http://www.blogjava.net/dreamzqy29/archive/2007/06/17/124819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamzqy29/comments/commentRss/124819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamzqy29/services/trackbacks/124819.html</trackback:ping><description><![CDATA[<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javascript 中的函数 <br><br>javascript 的 function 对象在调用过程中具有一个 arguments 属性，它是由脚本解释器创建的，这也是创建 arguments 唯一途径。 Arguments 对象可以看作是一个 Array 对象，它具有 length 属性，可以通过序号访问每一个参数。 Arguments 有个 callee 属性，可以获取到执行的 function 对象的引用。 </p>
<p>eg ： </p>
<p>funtion f1 （ n ） </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(n&lt;=0) </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1; </p>
<p>}else </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return n*arguments.callee(n-1);// 实际同 return n*f1(n-1); </p>
<p>} </p>
<p>上例利用 callee 属性实现了匿名的递归调用。 </p>
<p>&nbsp; </p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apply 和 call 方法： </p>
<p>apply 方法和 call 方法有形似之处，两者都将函数绑定到其他对象上执行。 </p>
<p>举例： </p>
<p>obj1.fun1.apply(obj2,[&#8220;test&#8221;]); </p>
<p>含义：是将 obj1 对象的方法 fun1 绑定到 对象 obj2 上，并使用参数 test 。 </p>
<p>obj1.fun1.call(obj2,&#8220;test&#8221;); </p>
<p>含义同上，他们区别是在 apply 参数以 array 对象传入。而 call 是依次传入参数的。 </p>
<p>&nbsp; </p>
<p>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this 和 with </p>
<p>this 在对象的方法被调用时候，指代调用该方法的对象实例。 </p>
<p>使用 with 语句时，代码变得更加短且易读： </p>
<p>没有用 with 之前 </p>
<p>x = obj.fun1(&#8220;a&#8221;); </p>
<p>y = obj.fun2(&#8220;b&#8221;); </p>
<p>用 with 之后，就变成： </p>
<p>with(obj) </p>
<p>{ </p>
<p>x=fun1(&#8220;a&#8221;); </p>
<p>y=fun2(&#8220;b&#8221;); </p>
<p>} </p>
<p>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for in </p>
<p>在 javascript 中可以使用 for in 语句遍历对象中所有属性和方法。例如下面的代码就遍历了 test1 对象的属性和方法，如果是属性则输出属性值，如果是方法则执行方法。 </p>
<p>&nbsp; </p>
<p>for(p in t) </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(typeof(t[p])==&#8221;function&#8221;) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t[p](); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(t[p]); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>} </p>
<p>&nbsp; </p>
<p>二、 javascript 面向对象编程实现 </p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对比 java 中面向对象编程中继承，以及封装，多态等常见概念，进行总结。 </p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类的声明 </p>
<p>首先来看下类的实现，前面已经使用了一种声明类的方法。 </p>
<p>&nbsp; </p>
<p>function test1() </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.prop1 = &#8220;prop1&#8221;; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.prop2 =&#8221;prop2&#8221;; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.fun1 = function() </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230; </p>
<p>} </p>
<p>} </p>
<p>&nbsp; </p>
<p>上面代码声明了两个公有属性，和一个方法。大家都知道类里除了公有成员还可能还有一些私有成员变量，但是 javascript 并没有提供相应的机制来定义私有成员变量，不过利用一些 javascript 的小技巧就可以实现私有成员变量。如下： </p>
<p>function test1 () </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var prop3 = &#8220;test&#8221;; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.prop1 = &#8220;prop1&#8221;; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.prop2 =&#8221;prop2&#8221;; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.fun1 = function() </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230; </p>
<p>} </p>
<p>} </p>
<p>&nbsp; </p>
<p>上面代码通过 var 关键字声明了一个局部变量 prop3 ，其作用域是 test1 类定义的内部，这样就实现了变量私有化。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外在 javascript 中可以通过下面的方式声明静态属性和静态方法。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; script LANGUAGE =" JavaScript " &gt; </p>
<p>&nbsp;&nbsp;&nbsp; function test ( n ) </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; test . staticProp = " static prop test!" ; </p>
<p>&nbsp;&nbsp;&nbsp; test . staticMechod = function () </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert ( "adfadfd" ); </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; alert ( test . staticProp ); </p>
<p>&nbsp;&nbsp;&nbsp; test . staticMechod (); </p>
<p>&nbsp; </p>
<p>&lt;/ script &gt; </p>
<p>实际上没有感觉到 javascript 中静态的必要性（不像 java ），也许是我对书本理解的不够，或者是应用太少。如果有读者朋友，有不同认识，欢迎发表看法，大家交流。 </p>
<p>&nbsp; </p>
<p>如果要声明一个类的实例属性或方法，可以使用 javascript 中对象的 prototype 属性。例如： </p>
<p>test1.prototype.prop1 = &#8220;prop1&#8221;; </p>
<p>test1.prototype.method1 = function(){} </p>
<p>利用 prototype 属性，可以实现另外一种类的声明方式： </p>
<p>&lt; script LANGUAGE =" JavaScript " &gt; </p>
<p>&nbsp;&nbsp;&nbsp; function test () </p>
<p>&nbsp;&nbsp;&nbsp; {} </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test . prototype = </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p1 : "p1" , </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p2 : "p2" , </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f1 : function () </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert ( "f1" ); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var te = new test (); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; te . f1 (); </p>
<p>&lt;/ script &gt; </p>
<p>上面使用 {} 的方式声明了一个匿名对象，大括号内用逗号将属性与值的列表分隔开。可以看到，采用 prototype 的方式声明类，代码更加简洁明了。因此这种方式在很多 AJAX 框架中得到广泛应用。 </p>
<p>&nbsp; </p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继承 </p>
<p>javascript 本身并没有提供继承，那么如何实现类的继承呢？最直接大方法是复制原方法，然后在里面加入新成员。但这样做实在是落后，因为当原类变化，新继承的类还要手动变化，容易出错。而下面这种用 for in 控制的复制就不那么容易出错了。 </p>
<p>&nbsp; </p>
<p>function test1() </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(p in test.prototype) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test1.prototype[p] = test.prototype[p]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test1.prototype.newmethod = function() </p>
<p>{ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&#8220;newfunction&#8221;); </p>
<p>} </p>
<p>} </p>
<p>&nbsp; </p>
<p>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多态 </p>
<p>多态的是实现可以采用和继承类似的方法。首先定义一个抽象类，其中可以调用一些虚方法，虚方法在抽象类中没有定义，而是通过其具体实现类来实现的。 </p>
<p>&nbsp; </p>
<p>&lt; script LANGUAGE =" JavaScript " &gt; </p>
<p>&nbsp;&nbsp;&nbsp; // 一个继承方法 </p>
<p>&nbsp;&nbsp;&nbsp; Object . extend = function ( destination , source ) </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( pro in source ) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination [ pro ] = source [ pro ]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return destination ; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; // 一个基类 </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; function base (){} </p>
<p>&nbsp;&nbsp;&nbsp; base . prototype = </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f1 : function () </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this . oninit (); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; // 扩展1 </p>
<p>&nbsp;&nbsp;&nbsp; function test1 () </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; test1 . prototype = Object . extend ( </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prop : "prop" , </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oninit : function () </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert ( this . prop ); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; }, base . prototype ); </p>
<p>&nbsp;&nbsp;&nbsp; // 扩展2 </p>
<p>&nbsp;&nbsp;&nbsp; function test2 () </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; test2 . prototype = Object . extend ( </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prop2 : "prop2" , </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oninit : function () </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert ( this . prop2 ); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; }, base . prototype ); </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; // 测试 </p>
<p>&nbsp;&nbsp;&nbsp; var t1 = new test1 (); </p>
<p>&nbsp;&nbsp;&nbsp; t1 . f1 (); </p>
<p>&nbsp;&nbsp;&nbsp; var t2 = new test2 (); </p>
<p>&nbsp;&nbsp;&nbsp; t2 . f1 (); </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&lt;/ script &gt; </p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/dreamzqy29/aggbug/124819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamzqy29/" target="_blank">黑夜ちつ独行者</a> 2007-06-17 17:31 <a href="http://www.blogjava.net/dreamzqy29/archive/2007/06/17/124819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>