一直都在用JavaScript完成一些客戶端的功能,每次應用都是到網上現查現用,卻從來沒有系統的學習一下JavaScript。

          有一次企圖偷窺一下它的內涵,發現身邊一個朋友正捧著一本JavaScript的書在看,忘記叫什么名字了,只記得比《thinking in java》還要厚,當時就放棄了偷窺的念頭。

          昨天在看關于AJAX的一本書時,正好很大的一部分篇幅是講JavaScript的。讀了讀,感覺JavaScript真的好強大。同樣是一種面向對象的語言,學習起來有很多和JAVA很相似的地方。

          JavaScript中的"類"

          在面向對象的思想中,最核心的概念之一就是類。 一個類表示了具有相似性質的一類事物的抽象,通過實例化一個類,可以獲得屬于該類的一個實例,即對象。

          在JavaScript中,最常見的代碼如下:

          function funcName(){
            
          // 具體內容
          }


          我們叫funcName為一個函數,其實funcName也可以理解成一個類,甚至也可以理解成一個對象。

          認識function

          我們都知道可以用function關鍵字定義一個函數,并為每一個函數指定一個函數名,通過函數名來進行調用。在JavaScript解釋執行時,函數都是被維護為一個對象,這就是函數對象。

          函數對象和其它用戶自定義的對象有著本質的區別,它和日期對象(Date),數組對象(Array)等一樣,都屬于內部對象。這些對象的構造器是有JavaScript本身定義的:通過執行new Date()這樣的語句返回一個對象。

          函數對象對應的類型是function,同日期對象對應的類型是Date一樣,可以通過new function()來創建一個函數對象,也可以通過function關鍵字來創建一個對象。如:

          function func()
          // 1.有名函數,函數名為func。
          //
           2.函數名被調用才執行。
          }

          var func = new function()
          // 1.無名函數,func只是一個變量對象指向了這個函數。
          //
           2.先初始化函數,也就是執行一次,再把創建的函數對象賦給func。
          }


          prototype原型對象

          prototype是一個對象。

          prototype對象是實現面向對象的一個重要機制,所以特別記錄一下。

          由上面可以看出,每個函數其實也是一個對象,它們對應的類是“function”。這里,JavaScript同Java不同,就是,每一個函數對象都有一個子對象prototype。prototype對象表示該函數的原型,把函數理解成類,也就是說,prototype表示了一個類的組成。

          當通過new來獲取一個類的對象的時候,prototype對象的成員都會成為實例化對象的成員。如:

          function student(){
          }

          student.prototype.name
          ="realsmy";
          student.prototype.showBlog
          =function(){
              alert(http:
          //www.aygfsteel.com/realsmy);
          }


          類的實現

          // 定義一個類student
          function student(){
            
          // 相當于構造函數
          }

          // 無類型對象的構造方法來指定prototype對象。
          student.prototype = {
            
          // 屬性
            name:"realsmy";
            
          // 方法
            showBlog:function(){
              alert(
          this.name+" :http://www.aygfsteel.com/realsmy");
              
          // 注意,類的成員之間互相引用,必須通過this指針來進行。
            }

          }

          這樣更像傳統意義面向對象語言中類的實現,只是構造函數和類的定義被分成了兩個部分。

          實現private,static

          private:
          前面的例子都屬于共有成員,也就是說,向任何實例公開這些屬性和方法。
          JavaScript中沒有特殊的機制來定義私有成員,但可以通過變量的作用域來實現。

          function student(){
            
          var id = "007";
            
          this.myId = id;
            
          this.showId() = function(){
              alert(id); 
          // 可以訪問id
              alert(this.myId); 
            }

          }

          var stu = new student();
          // stu.id這個會被認作是未定義的
          stu.myId = "008"// 有效賦值
          stu.showId(); // 彈出"007"和"008"


          static:

          靜態成員也是一個類的成員。
          因為函數也是一個對象,所以可以用給函數對象直接添加成員的方法來實現靜態成員。

          function student(){
          }

          // 靜態屬性
          student.school = "po da xue";
          // 靜態方法
          student.out = function(){
            alert(
          "jin tian ni tao ke le ma?");
          }

          這樣每一個student對象都可以調用到那個屬性和方法。
          或者
          function.prototype.show = function(){
            
          // 
          }


          這樣是給每個函數對象都添加通用的靜態方法。

          類的繼承

          利用反射機制和prototype實現繼承
          為了方便,可以先為每一個類添加一個共有的方法,用以實現繼承。

          function.prototype.inherit = function(baseClass){
            
          // 反射機制
            for(var p in baseClass.prototype){
              
          this.prototype[p] = baseClass.prototype[p];
            }

          }

          基類

          function class1(){
            
          // 
          }

          class1.prototype 
          = {
            
          // 
            method:function(){}
          }

          子類

          function class2(){
            
          // 
          }

          class2.inherit();
          class2.prototype.method 
          = function(){
            
          // 覆蓋父類中的method方法。
          }


          這樣的方法是在犧牲了一定的代碼可讀性為代價的前提下,實現了類的繼承。據說現在javascript的一種框架已經更好的實現了類的繼承機制,還沒有研究過。呵呵。

          function是所有函數對象的基礎,Object是所有對象(包括函數對象)的基礎。

          感覺,所有面向對象語言的設計思想都是一致的。簡單說就是以對象為基礎。JavaScript作為一種面向對象的語言,同樣是以對象為基礎的。

          理解JavaScript面向對象的思想,對我以后學習JavaScript的一些高級技術會有很大幫助。

          故,記錄筆記于此。



          歡迎來訪!^.^!
          本BLOG僅用于個人學習交流!
          目的在于記錄個人成長.
          所有文字均屬于個人理解.
          如有錯誤,望多多指教!不勝感激!

          Feedback

          # re: 從Java的面向對象之后再學JavaScript的面向對象  回復  更多評論   

          2007-09-21 17:16 by 千里冰封
          面向對象的思想就是好

          # re: 從Java的面向對象之后再學JavaScript的面向對象  回復  更多評論   

          2007-09-21 17:22 by 久城
          :)恩。特別是學過一種語言之后,再學另一種時,理解上會快很多。

          只學JAVA時還對面向對象沒什么感覺,再學另一種面向對象的語言時,才開始有那么一點點感覺,發現很多共同的思想,我想那就是都是基于面向對象使然的吧。

          # re: 從Java的面向對象之后再學JavaScript的面向對象  回復  更多評論   

          2007-09-22 17:31 by 我為J狂
          好東西,收藏了。

          # re: 從Java的面向對象之后再學JavaScript的面向對象  回復  更多評論   

          2007-11-22 18:34 by 彭俊
          呵呵 不錯

          不過在 function.prototype.show()的定義不能算是student的靜態方法。

          # re: 從Java的面向對象之后再學JavaScript的面向對象  回復  更多評論   

          2007-11-22 20:47 by 久城
          @彭俊

          好久不見。

          function.prototype.show()為什么不算是靜態方法呢?

          Copyright © 久城

          主站蜘蛛池模板: 博湖县| 慈溪市| 宁城县| 广安市| 江永县| 凉城县| 蕲春县| 日喀则市| 巴彦县| 武冈市| 菏泽市| 安丘市| 长春市| 东乡| 平江县| 长岭县| 理塘县| 大洼县| 兴业县| 屏东县| 龙南县| 临武县| 奎屯市| 厦门市| 宣威市| 葫芦岛市| 商丘市| 芦山县| 江安县| 德钦县| 内江市| 波密县| 盐池县| 墨脱县| 砚山县| 梅州市| 灌云县| 崇仁县| 本溪市| 苗栗市| 宁德市|