繁体   English   中英

在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中检查它们(超或子类)并应用。

const myDecorator = (ctx) => { ... }
...
draw(ctx) {
  this.decorators.forEach(draw => draw(ctx));
}

根据您的用例,第一个是更干净的OOP,第二个是更复杂的功能性学习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM