2012-09-19 18 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

相关问题