在ES6中包装类函数和使用super的简单方法
Straightforward way to wrap class function and use super in ES6
我正在用ES6编写一个应用程序,并使用babel进行编译。我有一系列的形状对象(正方形,长方形,梯形等)
我希望能够使这些对象中的一些"特殊"对象,例如,有双边框或圆角。但我不想创建每个对象的子类(例如,DoubleBorderRectangle, DoubleBorderSquare)
这似乎是一个介绍装饰器的好地方。
当我想修饰一个使用super.
的方法时,我遇到了一些问题。例如,我有这样一个类:
class Trapezoid extends Sprite {
constructor(x, y, width, height) {
super(x, y, width, height);
this.type = "Trapezoid";
//other trapezoid specific functions here.
}
draw(ctx) {
super.draw(ctx);
//specific code for drawing trapezoid here.
}
}
现在我想实例化一个特殊的梯形,比如双边框,使用装饰器:
function doubleBorder(shape) {
shape.draw = function(ctx) {
//draw the trapezoid.
super.draw(ctx);
//double border drawing stuff here.
}
return shape;
}
并实例化:
let trapezoid = new Trapezoid(0,0,100,100);
let doubleBorderTrapezoid = doubleBorder(trapezoid);
一个问题是babel不喜欢在类之外使用super。这是可以理解的。是否有一种方法来获得形状的超类,并传递它正确的上下文,而不创建一个一次性对象?
我知道这是旧的,但你可以实现许多方法,所以它归结为风格和代码行。
1)在父类中创建一个函数来添加双轮廓,假设它将被多个子类使用。
2)创建一个装饰器函数数组(超类或特定子类),然后在draw (super或sub)中检查这些函数并应用。
const myDecorator = (ctx) => { ... }
...
draw(ctx) {
this.decorators.forEach(draw => draw(ctx));
}
根据您的用例,第一个是更干净的OOP,第二个是更多的组合功能学习。
相关文章:
- 简单的javascript在Shopify中不起作用
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 如何制作简单的php'在Javascript中的foreach等价物
- JQuery:向多个匹配结果添加换行符的最简单方法
- AJAX简单错误.XMLHttpRequest无法加载http://localhost/mpl/getPage.php.
- Moment/Jquery-一个简单时间线的愚蠢问题
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 简单类测试未通过
- 简单地将拆分变量添加到对象中
- 通过javascript操作图像,非常简单
- 问题用moment JS制作一个简单的时间表
- 简单的ES6承诺问题-交换解决和拒绝参数
- 带有计数器、缩略图、进度条和淡入淡出效果的简单jQuery幻灯片
- 简单的JS函数.需要对变量进行澄清
- 简单的交换程序无法使用javascript
- 如何只使用特定的表行构建简单的手风琴
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- react路由器使用简单的javascript路由器配置来处理不匹配的路径
- 简单的JavaScript方法链接
- 在ES6中包装类函数和使用super的简单方法