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

前端之家收集整理的这篇文章主要介绍了如何重用和覆盖继承的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!

猜你在找的JavaScript相关文章