【发布时间】:2011-10-25 04:28:59
【问题描述】:
我正在尝试使用 OO 方法学习 JavaScript。这是我的代码:
/*global document, MouseEvent */
MouseEvent.prototype.mouseCoordinates = function () {
return {
'x' : this.pageX - this.target.offsetLeft,
'y' : this.pageY - this.target.offsetTop
};
};
(function () {
var Pencil = function () {},
Canvas = function () {
this.element = document.getElementById('canvas');
this.tool = new Pencil();
this.element.addEventListener('click', this.tool.draw, false);
},
c;
Pencil.prototype.draw = function (event) {
var context = event.target.getContext('2d'),
coordinates = event.mouseCoordinates();
context.fillRect(coordinates.x, coordinates.y, 5, 5);
};
c = new Canvas();
}());
我正在尝试做一些类似 MS Paint 的事情。所以,我创建了一个 Canvas 对象和一个 Pencil 对象。我可以使用程序方法来做到这一点,但我不想这样做。我现在不想使用任何图书馆,我只是在学习。
我有这些问题:
注册事件有什么好的做法吗?我应该使用对象构造函数注册事件吗?
我的画布对象有一个工具(在本例中为铅笔)对象。从概念上讲,它并不好。我的画布不应该有工具对象。它必须提供一个可以绘制的表面,仅此而已!但是,它作为回调(点击事件)存在。我该如何解决这个问题?
每个工具都有相同的界面,但行为不同。我可以使用 Javascript 创建接口吗?
我还能改进什么?
更新:
(function () {
var pencil = {
draw : function (event) {
var context = event.target.getContext('2d'),
coordinates = event.mouseCoordinates();
context.fillRect(coordinates.x, coordinates.y, 5, 5);
}
},
currentTool = pencil,
canvas = (function () {
var object = {};
object.element = document.getElementById('canvas');
object.element.addEventListener('click', function (event) {
currentTool.draw(event);
}, false);
return object;
}());
}());
我已遵循所有提示(谢谢,感谢您的帮助!)。你怎么看?现在我有一个“全局” currentTool 变量。你怎么看待这件事?谢谢。
谢谢。
【问题讨论】:
-
(1) 要绑定事件,请使用
addEventListener。 “使用对象构造函数注册事件”是什么意思? (2) 只需将Pencil实例定义为独立对象,而不是Canvas实例的属性。 (3) 这是个好问题。接口不是 JavaScript 的一部分,但可能有一种方法可以模拟它们...... -
对不起,我的意思是:“我应该在哪里绑定事件?”。谢谢。
-
你做对了。在
Canvas构造函数中,您创建一个新的 CANVAS 对象,然后将点击处理程序绑定到它。没关系。但是,请考虑使用canvasClicked处理程序,而不是直接绑定到pencil.draw。在canvasClicked处理程序中,您可以确定用户做了什么(如果有多种可能性),然后调用不同的函数... -
顺便说一句,您的页面上有多少 Canvas 实例?如果只有一个,那么构造函数并不是真正需要的,你可以定义一个代表 Canvas 元素的对象(单例)。
-
只有一个画布元素。我将阅读有关 JS 单例的信息。你推荐任何链接吗?关于 JS 的旧信息和错误信息太多了。谢谢。
标签: javascript events interface design-patterns