2012-09-19 19 views
0

據我所知,JavaScript應該被寫入的方式有很多不同的意見,但我想知道如果我寫它的方式是好的。我不想進入沒人理解的編寫代碼的工作。Javascript類和自定義事件處理程序正確的語法

這段代碼的基本前提是測試對象的自定義事件處理程序,不知道是否有任何明顯的「YOU SHOULD NOT DO THIS」式的東西

function EventClass() { 
     var self = this; 
     var events = {}; 
     var i = 0; 
     self.fire = function(evt, args) { 
      for (x in events[evt]) 
       events[evt][x].call(this, args); 
     } 

     self.on = function(evt, fn) { 
      if (events[evt] == null) { 
       events[evt] = [] 
      } 
      events[evt].push(fn); 
     } 
    }; 

    function Human(x, y) { 
     var self = this; 
     self.__proto__ = new EventClass(); 
     var xCoord = 0; 
     var yCoord = 0; 

     self.events = { 
      "MOVEMENT" : "movement" 
     }; 

     self.init = function(x,y) { 
      xCoord = x; 
      yCoord = y; 
     } 

     self.draw = function(context) { 
      context.beginPath(); 
      context.arc(xCoord,yCoord,10,0,Math.PI*2,true); 
      context.closePath(); 
      context.fill(); 
     } 

     self.moveLeft = function() { 
      xCoord -= 5; 
      self.fire(self.events.MOVEMENT, xCoord); 
     } 
     self.init(x,y); 
    }; 

    function Player(x, y) { 
     var self = this; 
     self.__proto__ = new Human(); 
     self.init(x,y); 
    }; 

    function Canvas(c) { 
     var self = this; 
     var canvas; 
     var context; 
     var objects = []; 

     self.init = function(c) { 
      canvas = c; 
      context = canvas.getContext("2d"); 
     }; 

     this.redraw = function() { 
      context.clearRect(0,0,300,300); 
      for (x in objects) { 
       objects[x].draw(context); 
      } 
     } 

     this.addObject = function(obj) { 
      objects.push(obj); 
      obj.on(obj.events.MOVEMENT, function(coord) { 
       console.log(coord); 
       self.redraw(); 
      }); 
     }; 
     self.init(c); 
    } 


    var canvas = new Canvas(document.getElementById("canvas")); 
    var human0 = new Human(75,75); 
    canvas.addObject(human0); 
    var human1 = new Human(100,100); 
    canvas.addObject(human1); 
    var player = new Player(200,200); 
    canvas.addObject(player); 

    canvas.redraw(); 

回答

0

一對夫婦的小東西 - 排序的。

第一個很小。

thisself一致。 我在這裏想到的例子是在你的Canvas的構造函數中。

事情的真相是,您的特定實施內容中沒有任何內容需要self。 除非您打算將方法提供給其他對象或回調,否則不需要self,直到您開始編寫存在於方法內部的函數。 即使如此,所有self將幫助訪問該特定實例的公共屬性/方法,並且不會幫助您訪問eventsi或其他任何內容。不要說它做得不好 - 當你做對象組合的事情時,而不是對象構造的東西(然後經常變得徹頭徹尾的需要),它就更加有用。

第二件事是更多的問題。 __proto__可能得到了相當好的支持,如果你在談論FireFox/Chrome,但是如果你需要支持大量的瀏覽器,那麼你將通過這樣做來讓你的生活變得更加困難,而不是增加到ConstructorFN.prototype對象。

+0

我是做Human.prototype =新的事件類()和Player.prototype =新人類()早,所有的對象都指向事件類的同一個實例,是有辦法解決這一問題? – Ven

+0

@Ven不完全,沒有。您正在創建一個EventClass對象。那個目標是所有人類的原型。那個人是所有玩家的原型。如果你不打算繼承基本上是「靜態」引用的屬性,我會建議查看組合,而不是繼承。可能我建議在這種情況下尋找***依賴注入***。任何其他形式的基於組件的組合將同樣有效。 – Norguard

相關問題