puk*_*puk 5 javascript dojo function redefine reusability
我有一个鼠标活动课程.我正在使用dojo b/c我喜欢它的OO方法
dojo.declare("MouseObject", null, {
constructor: function(){},
onclick : function(){...},
_onClick : function(){...}
});
Run Code Online (Sandbox Code Playgroud)
_onClick()侦听窗口生成的鼠标按下/释放事件并确定是否发生了单击.如果有,onClick()则被称为.onClick()执行所有可能的点击共同的功能,因此每次用户点击时都需要调用它.
有时用户可能想要扩展功能onClick()是否仍然存在原始功能而无需复制粘贴它?我能想到的两种方式,我都不喜欢
dojo.declare("MouseObjectChild", [MouseObject], {
constructor: function(){},
onclick : function(){this.inherited(arguments);...}
});
Run Code Online (Sandbox Code Playgroud)
这有一个缺点,我必须继续创建我不需要的新类,并且两个添加一个中间函数
dojo.declare("MouseObject", null, {
constructor: function(){},
onclick : function(){this._onClick()...}, //child onClick
_onClick : function(){...}, //parent onClick
__onClick : function(){...} //listener
});
Run Code Online (Sandbox Code Playgroud)
但这看起来不是很好的代码
作为赏金,我需要有关如何最好地解决程序 - 用户交互的专家建议.如果程序提供了一个关键功能,例如在画布上绘制一个圆圈,那么用户如何最好地与之交互.如果用户想在圆圈后面画一个三角形怎么办?圆圈前方的一个正方形?然后该程序必须提供前后方法,如下所示:
beforeDraw();
draw();
afterDraw();
Run Code Online (Sandbox Code Playgroud)
这被认为是好设计吗?我应该把函数指针放在一个数组中并按顺序调用它们吗?
正如“我应该将函数放在自己的数组中并按顺序调用它们”和“构建自己的事件系统”想法所建议的那样,您可能想看看捆绑在扩展中的dojox.lang.aspect库标准库。它基本上应该是“dojo.connect”解决方案的更高级版本。
dojo.require('dojox.lang.aspect');
var aop = dojox.lang.aspect;
function log(msg){ return function(){
console.log(msg);
};}
var obj = {
draw : log('draw circle');
};
obj.foo();
//prints
// draw circle
aop.advise(obj, 'draw', [
{before: log('draw triangle')},
{after: log('draw a square')},
{after: log('done!')}
]);
obj.foo();
//prints
// draw a triangle
// draw a circle
// draw a square
// done!
Run Code Online (Sandbox Code Playgroud)