javascript面向對象編程筆記

首先看一個頁面常用的js代碼骨架

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>js面對對象編程</title>
</head>
<body>
<script type="text/javascript" src="../js/lib/jquery-1.11.0.js"></script>
<script type="text/javascript">
;(function($){
    var Obj = function(){//定義一個類
        console.log(this);//==>Obj
        this.init();
    }
    
    Obj.prototype = {//對象原型
        constructor:Obj,//構造函數
        ObjName:"我是一個對象",
        saySomething:function(){
            console.log(this.ObjName);
        },
        init:function(){
            this.saySomething();
        },
        print:function(str){
              console.log("Obj裏的輸出:"+str);
      console.log(this);
}
    };
    
    var Obj2 = function(){}
Obj2.prototype = new Obj();//類的繼承
console.log("Obj2.ObjName:"+new Obj2().ObjName); 
        //==>Obj2.ObjName:我是一個對象
Obj2.prototype.ObjName = "我繼承了Obj.ObjName並且重寫了它";
console.log("Obj2.ObjName:"+new Obj2().ObjName); 
         //==>Obj2.ObjName:我繼承了Obj.ObjName並且重寫了它
Obj2.prototype.print = function print(str){
     console.log("Obj裏的輸出:"+str);
     console.log(this);
};
    
    $(document).ready(function($) {
        var obj = new Obj();//實例化類 ==>輸出:我是一個對象
        var obj2 = new Obj2();//實例化類 ==>輸出:我是一個對象
console.log("Obj2.ObjName:"+obj2.ObjName); 
      //==>Obj2.ObjName:我繼承了Obj.ObjName並且重寫了它
        console.log(this);//==>#document
        obj2.print('試試1');//==>Obj2裏的輸出試試1,Obj2 {}
obj.print('試試2');//==>Obj裏的輸出:試試2,Obj {}
obj.print.call(obj2,'試試3');//==>Obj裏的輸出:試試3,Obj2 {}
obj.print.call(window,'試試4');//==>Obj裏的輸出:試試4,Window
obj2.print.call(obj,'試試5');//Obj2裏的輸出試試5,Obj {}

    });
    
    console.log(this);//==>Window
})(jQuery);
console.log(this);//==>Window
</script>
</body>
</html>



代碼分析:

一、立即執行函數表達式IIFE

        IIFE immediately-invoked function expression 

    寫法一(function($){...})(jQuery);

    寫法二(function($){...}(jQuery));

    其作用相當於

                   var a = function($){...};

                   a(jQuery);

                   讓編寫的代碼能立即執行。

    

二、function(){}

      在javascript中定義類函數都是funciton。


三、Obj.prototype類原型

      可以像上面那樣寫在一起,這叫完全重寫;

     也可以分開寫,叫做部分重寫,寫法如下:

      Obj.prototype.a = "我是字符串";

      Obj.prototype.b = {

                                        name:"我是對象"

                                       };

      Obj.prototype.c = ['我是','數組'];

      Obj.prototype.d= function(){

                                       return "";

                                       我是函數

                                         };


四、$(document).ready(function(){...});

       因爲html文檔是順序執行的所以如果代碼是寫在所有文檔元素之後這個$(document).ready()可以省略 



五、call

    函數名.call(調用者, 參數列表); //調用者不能省略,定義了這個函數的作用哉

  


六、js代碼前的分號;或加號(+)是爲了避免前一個js文檔如果沒有用分號結尾造成的文檔錯誤。


七、constructor構造函數

    構造函數:是一種特殊的方法,主要用來在創建對象時初始化對象,即爲對象成員變量賦初始值。總與new運算符一起使用在創建對象的語句中,特別的一個類可以有多個構造函數,可根據其參數個數的不同或參數類型的不同來區分它們,即構造函數的重載。

    在JavaScript中,對象的constructor屬性用於返回創建該對象的函數引用。

    每個具有原型的對象都會自動獲得constructor屬性。除了arguments、Enumerator、Error、Global、Math、RegExp、Regular Rxpression等一些特殊對象之外,其他所有的JavaScript內置對象都具備constructor屬性。例如:Array、Boolean、Date、Function、Number、Object、String等。所有主流瀏覽器均支持該屬性。

    當prototype完全重寫的時候(就是Obj.prototype = {}的形式),這時prototype的構造器是Object,宿主構造器不直接具備prototype的屬性,也正因如此,在prototype聲明之前已經創建好的對象,不能使用prototype屬性——完全重寫將原來的實例和prototype切斷了。

    prototype的部分重寫,是在原來的基礎上新增了屬性或者方法,而完全重寫則是推翻原有的,重新開始,那麼,如果即想把所有新增方法都寫在一起,又要保留原有的屬性的時候,就需要用到“constructor:類名稱”這句話把構造器指回來。

    

   



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章