外部函数与类方法的内联绑定

时间:2017-12-19 12:01:25

标签: javascript ecmascript-6 es6-class ecmascript-next

我们说我有一个返回这样一个函数的函数:

function createGreeter(logger) {
  return function greet(greeting) {
    logger.log(greeting + ', ' + this.name);
  }
}

和一个班级

class Person {
  constructor(name) {this.name = name;}
}

如果我想将一个greet方法分配给使用控制台作为记录器的Person类,我可以想到几种方法:

1.

class Person {
  constructor(name) {this.name = name;}

  greet(greeting) {
    return createGreeter(console).call(this, greeting);
  }
}

2.

class Person {
  constructor(name) {this.name = name;}
}

Person.prototype.greet = createGreeter(console);

然而,我认为这些都有些难看; 1)创建一个基本上不必要的包装器方法,只需绑定this并调用该函数,2)修改类主体之外的原型,在我看来,这使得类API不太清晰。

内联赋值和外部函数与类方法的绑定是否没有更清晰/更短的语法。我想的是:

class Person {
  constructor(name) {this.name = name;}

  greet: createGreeter(console)
}

...类似于如何在对象文字中分配函数。但显然这不起作用。是否有类似的东西(现在或将来)?

另外,如果返回的函数很大,我想知道返回闭包的内存消耗和/或性能方面,如1)。每次在Person对象上调用greet方法时,即使我们总是希望将相同的参数(console)传递给它,也会创建一个新的函数对象。所以另一种方法可能是在类定义之前声明const consoleGreeter = createGreeter(console)并将问候语实现为return consoleGreeter.call(this, greeting),但它是否值得呢?

3 个答案:

答案 0 :(得分:1)

好的,这里是bind

class外部方法的替代方法
class Person {
  constructor(name) {this.name = name;}
  get greet() { return createGreeter(console) }
}

刚刚检查过,this工作正常。

答案 1 :(得分:1)

这将实现相同的效果#1,因为每次访问该方法时都会调用包装器。如果您可以提高可读性......



function createGreeter(logger) {
  return function greet(greeting) {
    logger.log(`${greeting}, ${this.name}`);
  };
}

class Person {
  constructor(name) {
    this.name = name;
  }

  get greet() {
    return createGreeter(console);
  }
}

let person = new Person('Patrick');

person.greet('Hello');




答案 2 :(得分:1)

class Person {
  constructor(name) {this.name = name;}
}

Person.prototype.greet = createGreeter(console);

是正确的方法,除非有其他问题(它会在TypeScript中出现问题)。

这也可以通过class fields来完成,这是第3阶段提案,可能会在ES2018中出现:

class Person {
  greet = createGreeter(console);
}

的快捷方式
class Person {
  constructor() {
    this.greet = createGreeter(console);
  }
}

第一个片段评估createGreeter(console)一次并将方法分配给类原型。第二个片段在每次实例化类时对其进行求值,并将该方法分配给类实例,效果较差。