javascript – 创建具有不同范围的ES6 / ESNext原型函数(不是内联函数)

好吧我们有这个:

class Car {
    constructor(name) {
        this.kind = 'Car';
        this.name = name;
    }

    printName() {
        console.log('this.name');
    }
}

我想要做的是定义printName,如下所示:

class Car {
    constructor(name) {
        this.kind = 'Car';
        this.name = name;
    }

    // we want to define printName using a different scope
    // this syntax is close, but is *not* quite correct
    printName: makePrintName(foo, bar, baz) 
}

其中makePrintName是一个仿函数,如下所示:

exports.makePrintName = function(foo, bar, baz){
   return function(){ ... }
};

这可能与ES6有关吗?我的编辑器和TypeScript不喜欢这个

注意:使用ES5,这很容易做到,看起来像这样:

var Car = function(){...};

Car.prototype.printName = makePrintName(foo, bar, baz);

使用类语法,目前最适合我的方法是:

const printName = makePrintName(foo,bar,baz);

class Car {
  constructor(){...}
  printName(){
    return printName.apply(this,arguments);
  }
}

但那并不理想.如果您尝试使用类语法来执行ES5语法可以执行的操作,您将看到问题.因此,ES6类包装器是一个漏洞抽象.

要查看真实用例,请参阅:

https://github.com/sumanjs/suman/blob/master/lib/test-suite-helpers/make-test-suite.ts#L171

使用TestBlock.prototype.startSuite = …的问题是,在这种情况下,我不能简单地在线返回类:

https://github.com/sumanjs/suman/blob/master/lib/test-suite-helpers/make-test-suite.ts#L67

解决方法:

我还没有提到的另一个想法是使用method decorator.以下装饰器采用方法实现并根据需要将其放在原型上:

function setMethod<T extends Function>(value: T) {
    return function (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<T>): void {
      descriptor.value = value;
      delete descriptor.get;
      delete descriptor.set;
    };
}

把它放在某个地方的图书馆里.这是你如何使用它:

class Car {
    constructor(name) {
        this.kind = 'Car';
        this.name = name;
    }

    @setMethod(makePrintName(foo, bar, baz))
    printName() {} // dummy implementation
}

唯一的缺点是你必须在类中使用正确的签名放置方法的虚拟实现,因为装饰器需要装饰一些东西.但它在运行时的行为与您想要的完全相同(它不是为每个实例花费新函数定义的实例方法,或者是在每次使用时花费额外函数调用的访问器).

这有帮助吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐