首頁 > web前端 > js教程 > 主體

利用原型和閉包,完成組件方法

高洛峰
發布: 2016-11-25 13:29:53
原創
1014 人瀏覽過

Java程式碼 
var Player = (function(){  
  Player = function(){ //這只是個空殼  
  throw new Error("Can not instantiate a Player object."); 1;  
Player.MAX_EXTENDED_TIME = 3;  
Player._player = false;  
Player.getInstance = function(){      Player._player = {  
      _name : name,  
         _name : name,  
         _name : name,  
        toString : function(name){  
        return "Player: " + this._name;  
      }  
}  
    
  return Player._player;  
};  
return Player; //把修繕完成的Player這個元件方法回傳  
})();  
 
//var
})();  
 
//var player = /var player(出異常  
var player1 = Player.getInstance();  
var player1 = Player.getInstance();  
var player2 = Player.getInstance();  
player2.setName("RealPlayer")  一個元件方法了,利用原型來實現。看看這樣如何:
Java代碼 
function Player(name){  
  Player.MIN_EXTENDED_TIME = 1;  
  Player.MAX_EXTEND_TIME = function(name) {  
  this._name = name;  
};  
Player.prototype.toString = function(){  
  return "Player: " + this._name;  
alert(player.toString()); //輸出WindowsMediaPlayer  
player.setName("RealPlayer");  
alert(player.toString()); //輸出RealPlayer  封裝、有常數、也有復寫了Object的toString方法,至於繼承之類的事情,咱們後面再說,初看看還不錯。可是這樣的組件方法定義不夠優雅,也不夠直觀,方法都是放在獨立的位置定義的,並沒有和最開始的組件方法放置在一起,如果能像Java那樣定義豈不更好?
 
對了,可以用閉包來實現。試試看:
Java程式碼 
function Player(name){  
  Player.MIN_EXTENDED_TIME = 1;  
  Player.MAX_EXTENDED_TIME = 3;  
  Player.MAX_EXTENDED_TIME = 3;  
  Player.MAX_EXTENDED_TIME = 3;  
    this._name = name;  
  };  
  this.toString = function(){  
    return "Player: " + this._name;  
  }; 
alert(player.toString ()); //輸出WindowsMediaPlayer  
player.setName("RealPlayer");  
alert(player.toString()); //輸出RealPlayer  
alert(Player)MAX_EXTENDED_TIME);了很大程度上的強化,包括新的語法的支援;JavaScript的閉包是很簡單的閉包,它沒有特殊的需要額外學習的語法,任意一個function,裡面只要包含未綁定變量,這些變量是在function所屬的上下文環境中定義的,那麼,這個function就是閉包。順便囉嗦一句,和閉包相反的,不正是不包含任何未綁定變數的函數式程式碼嗎?
寫是寫好了,可是轉念一想,Player應當只有一份,它是單例的,最好我也能像Java那樣弄一個單例模式出來:),可是事不遂願,我沒有辦法在JavaScript做一個private的建構器,用這種想法去實作單例模式似乎不可行…
怎麼辦?
 
然而天無絕人之路,我控制不了你new一個Player的對象,我卻可以控制你new出來的這個Player對象的屬性和行為!當你需要使用你new出來的Player的物件的時候,你發現根本無法完成,或者它只是一個空殼!真正的東西還是要靠單例中經典的getInstance方法來取得:
Java程式碼 
function Player(){  
throw new Error("Can not instantiate a Player object.");  
}; //這只是個空殼  
 
(function(){ //這就是貨真價實的東西? MAX_EXTENDED_TIME = 3;  
  Player._player = false;  
  Player.getInstance = function(){  
        Player._player = {  
        _name : name ,  
        setName : function(name){  
          this._name = name;      
          return "Player: " + this._name;  
        }  er ;  
  };  
})();  
 
//var player = new Player(); //new Player()會拋出異常  
var player1 = Player.get Player()會拋出異常  
var player1 = Player.getpstance(); );  
player2.setName("RealPlayer");  
alert(player2.toString()); //輸出RealPlayer 
 
好,真不錯,單例模式在Java下也成功實作了-你要膽敢 Player ();就會拋出一個異常,這樣什麼也得不到,只有用getInstance方法得到的物件才是真真正正的Player物件。上面的程式碼整個執行的結果,只彈出了一次"Init..."的對話框,說明真正的「構造器邏輯」只呼叫了一次。
 
都做到這份上了,依然有小小的遺憾,Player的定義依然被拆分成了兩部分,一部分定義空殼,一部分是一個匿名函數來定義Player的常數和getInstance方法。這兩部分不能合而為一?
能。只需要用到一個小小的匿名函數,如果耐心從頭看到這裡,也一定能理解:
 
到此,終於如釋重負,深入理解JavaScript面向對象,用好原型和閉包這兩把鋒利的武器,才能寫出優秀的前端程式碼來。有一些同事私下和我交流,後面盡量貼簡潔的程式碼,希望有物件導向基礎和JavaScript基礎的同事都能有所收穫。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!