1. 程式人生 > >JS 高級篇

JS 高級篇

var copy res value public 私有屬性 object tex 能夠

1. Function 對象

Java的方法僅僅是方法,但是JS的方法是一個對象,可以作為參數!

  1. Function 對象引入
    • Function 是 js 的方法對象,可以用 Function 實例化出任何 js 方法對象;
  2. 用 Function 創建方法對象
  3. Function 對象屬性
  4. Function 對象方法

2. JavaScript 閉包

  1. Js 變量的作用域
    • 方法體外定義 ( var a=22; ),全局變量,所有方法可以取到
    • 方法體內定義 ( var a=22; ),局部變量,外部方法不可以取到
    • 方法體內定義 ( a=22; ),全局變量,所有方法可以取到
  2. 從外部讀取方法內部的局部變量:通過閉包
    <script type="text/javascript">
       
       var
    a=11; //全局變量 function func(){ var b=22; //局部變量 c=33;// 全局變量      //閉包 function func2(){ alter(b); } return func2; } alter(a); //成功 alter(b); //失敗 alter(c); //成功 // 利用閉包從外部讀取內部的局部變量 var result=func(); result(); //成功打印局部變量b
    </script>
  3. 閉包的概念
    • 閉包就是能夠讀取其他函數內部變量的函數。
    • 由於在 Javascript 語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成“定義在一個 函數內部的函數”。
    • 在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
  4. 閉包的用途
    1. 讀取函數內部的變量,
    2. 讓這些變量的值始終保持在內存中。
  5. 閉包的使用註意點
    • 由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在 IE 中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
    • 閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

3. JavaScript 面向對象實現

  1. 面向對象三大特征
    • 封裝、繼承、多態
    • JS本身沒有,但可以模擬實現
  2. JavaScript 自定義對象
    • 創建對象方式:
      1. 方式1,對象初始化器方式;鍵值對的形式
        var marry={
            name:"marry",
            age:2,
            shout:function(){
                alter(this.name+this.age);
            },
            action:function(){
                alter("會吃");
            }
        }    
      2. 方式2,構造函數方式;
        function Dog(name,age){
            this.name=name;
            this.age=age;
            this.shout=function(){
                alter(this.name+this.age);
            };
            this.action=function(){
                alter("會吃");
            }; 
        }    
        
        var jack=new Dog("jack",1);
    • 對象屬性定義:
      1. 私有屬性;
      2. 對象屬性;
      3. 類屬性;
        //定義
        function C(){
            this.objPro="對象屬性1";
            C.proyotype.objPro2="對象屬性2"
        
            var privatePro="私有屬性";
        }
        C.classPro="類屬性";
        
        //使用
        //對象屬性 必須要 new var c=new C(); alter(c.objPro); alter(c.objPro2); //私有屬性,要用閉包取出 //類屬性,直接調用 alter(C.classPro);
    • 對象方法定義:
      1. 私有方法;
      2. 對象方法;
      3. 類方法;
        //定義
        function(){
           var privateFunc=function(){
               alert("私有方法");
            };
            this.objFunc=function(){
                alert("對象方法");
            };
            C.prototype.objFunc2=function(){
                 alert("對象方法2");
            };
        
        }
        
        C.classFunc=function(){
            alert("類方法");
        };
        
        //調用
        
        // 對象方法 必須要 new
        var c=new C();
        c.objFunc();
        c.objFunc2();
        
        // 私有方法,內部調用
        //類方法
        C.classFunc();
  3. JavaScript 實現封裝特性
    • 對象裏面對屬性進行封裝,在之後調用
  4. JavaScript 實現繼承特性
    • Apply() 實現屬性和方法的繼承,原型還是不變
      function Animal(name,age){
          this.name=name;
          this.age=age;
          this.shout=function(){
              alert(this.name+this.age);
          };
          this.action=function(){
              alert("會吃");
          }; 
      }  
      
      function Dog(name,age){
          Animal.apply(this, [name,age]); //把Animal的屬性copy給Dog ,原型不變,還是條狗
      }      
      
      var jack=new Dog("jack",1); 
      alert(jack.name); alert(jack.age); jack.shout(); jack.action();
    • Prototype 實現原型的繼承;
      function Dog(name,age){
          Animal.apply(this, [name,age]); //把Animal的屬性copy給Dog 
      }  
      Dog.prototype=new Animal(); //原型改變,是animal
  5. JavaScript 實現多態特性
    function Animal(){
        this.say=function(){
            alert("我是動物");
        };
    }  
    
    function Dog(){
        this.say=function(){
            alert("我是狗");
        };
    }  
    Dog.prototype=new Animal();
    
    function Cat(){
        this.say=function(){
            alert("我是貓");
        };
    }  
    Cat.prototype=new Animal();
    
    function say(animal){
        if(animal instanceof Animal){
            animal.say();
        }
    }
    
    var dog=new Dog();
    var cat=new Cat();
    say(dog);  //我是狗
    say(cat);  //我是貓

JS 高級篇