如何重用和覆盖继承的javascript函数

我有一个鼠标活动课程.我正在使用dojo b / c我喜欢它的OO方法

dojo.declare("MouSEObject",null,{
  constructor: function(){},onclick : function(){...},_onClick : function(){...}
});

_onClick()侦听窗口生成的鼠标按下/释放事件,并确定是否发生了单击.如果有,则调用onClick(). onClick()执行所有可能的点击共有的功能,因此每次用户点击时都需要调用它.

有时用户可能想要扩展onClick()的功能无论如何要包含原始功能而不复制粘贴它?我能想到的两种方式,我都不喜欢

dojo.declare("MouSEObjectChild",[MouSEObject],onclick : function(){this.inherited(arguments);...}
});

这有一个缺点,我必须继续创建我不需要的新类,并且两个添加一个中间函数

dojo.declare("MouSEObject",{
      constructor: function(){},onclick : function(){this._onClick()...},//child onClick
      _onClick : function(){...},//parent onClick
      __onClick : function(){...} //listener
    });

但这看起来不是很好的代码

作为赏金,我需要有关如何最好地解决程序 – 用户交互的专家建议.如果程序提供了一个关键功能,例如在画布上绘制一个圆圈,那么用户如何最好地与之交互.如果用户想在圆圈后面画一个三角形怎么办?圆圈前方的一个正方形?然后该程序必须提供前后方法,如下所示:

beforeDraw();
draw();
afterDraw();

这被认为是好设计吗?我应该把函数指针放在一个数组中并按顺序调用它们吗?

最佳答案
正如“我应该将函数放在自己的数组中并按顺序调用它们”和“构建自己的事件系统”的想法所建议的那样,您可能希望查看扩展标准库中捆绑的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!

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...