Javascript类和自定义事件处理程序正确的语法
我知道对于javascript的编写方式有很多不同的观点,但我想知道我现在的编写方式是否合适。我不想进入职场去写没人懂的代码 这段代码的基本前提是测试对象的自定义事件处理程序,我想知道是否有任何明显的“您不应该这样做”类型的事情Javascript类和自定义事件处理程序正确的语法,javascript,javascript-events,Javascript,Javascript Events,我知道对于javascript的编写方式有很多不同的观点,但我想知道我现在的编写方式是否合适。我不想进入职场去写没人懂的代码 这段代码的基本前提是测试对象的自定义事件处理程序,我想知道是否有任何明显的“您不应该这样做”类型的事情 function EventClass() { var self = this; var events = {}; var i = 0; self.fire = function(evt, args
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();
一些小事情--有点像
第一个很小
与这个
和自我
的东西保持一致。
我在这里想到的示例是在您的画布中的构造函数
事实上,您的特定实现中没有任何东西需要self
。
除非您计划将您的方法提供给其他对象或回调,否则在您开始编写方法内部的函数之前,self
不是必需的。
即使这样,所有的self
都将帮助您访问该特定实例的公共属性/方法,而不会帮助您访问events
或i
或其他内容
并不是说这样做不好——只是当你在做对象合成的事情,而不是对象构造的事情时,它更有用(而且经常变得非常必要)
第二件事更像是个问题。
如果你说的是FireFox/Chrome,那么\uuuu proto\uuuuu
可能会得到很好的支持,但是如果你需要支持广泛的浏览器,那么这样做会让你的生活更加困难,而不是添加到构造函数fn.prototype
对象中。我在做Human.prototype=new EventClass()和Player.prototype=new Human(),并且所有对象都指向同一个EventClass实例,是否有办法解决此问题?@Ven不完全是,不。您正在创建一个EventClass对象。一个物体是所有人类的原型。一个人是所有玩家的原型。如果您不想继承基本上是静态引用的属性,我建议您考虑组合,而不是继承。我建议在这种情况下研究依赖注入。任何其他形式的基于组件的组合都同样有效。