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

Javascript 外部函数到类方法的内联绑定,javascript,ecmascript-6,es6-class,ecmascript-next,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;} } 如果我想为使用控制台作为记录器的Person类分配一个greet方法,我可以想出几种方法: 1

假设我有一个函数,它返回如下函数:

function createGreeter(logger) {
  return function greet(greeting) {
    logger.log(greeting + ', ' + this.name);
  }
}
还有一节课

class Person {
  constructor(name) {this.name = name;}
}
如果我想为使用控制台作为记录器的
Person
类分配一个greet方法,我可以想出几种方法:

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)
,并将greet实现为
return-consoleGreeter.call(this,greeting)
,但这样做值得吗?

好,下面是
将外部方法绑定到

class Person {
  constructor(name) {this.name = name;}
  get greet() { return createGreeter(console) }
}

刚刚选中,
这个
也可以正常工作。

好的,这里有一个替代方法,可以将
外部方法绑定到

class Person {
  constructor(name) {this.name = name;}
  get greet() { return createGreeter(console) }
}

刚刚选中,
这个
也可以正常工作。

这将达到相同的效果#1,因为每次访问该方法时都会调用包装器。如果你不介意提高可读性

函数createGreeter(记录器){
返回功能问候语(问候语){
logger.log(`${greeting},${this.name}`);
};
}
班主任{
建造师(姓名){
this.name=名称;
}
得到问候{
返回createGreeter(控制台);
}
}
let person=新人(“Patrick”);

person.greet('Hello')这将达到相同的效果#1,因为每次访问该方法时都会调用包装器。如果你不介意提高可读性

函数createGreeter(记录器){
返回功能问候语(问候语){
logger.log(`${greeting},${this.name}`);
};
}
班主任{
建造师(姓名){
this.name=名称;
}
得到问候{
返回createGreeter(控制台);
}
}
let person=新人(“Patrick”);
person.greet('Hello')
是正确的方法,除非有其他问题(TypeScript中会有问题)

这也可以通过第3阶段提案完成,该提案可能会在2018年欧洲标准化会议上落地:

class Person {
  greet = createGreeter(console);
}
哪一条是你的捷径

class Person {
  constructor() {
    this.greet = createGreeter(console);
  }
}
第一个代码段计算
createGreeter(控制台)
一次,并将该方法分配给类原型。第二个代码段在每次实例化类时对其进行求值,并将该方法分配给类实例,这会降低效率

是正确的方法,除非有其他问题(TypeScript中会有问题)

这也可以通过第3阶段提案完成,该提案可能会在2018年欧洲标准化会议上落地:

class Person {
  greet = createGreeter(console);
}
哪一条是你的捷径

class Person {
  constructor() {
    this.greet = createGreeter(console);
  }
}

第一个代码段计算
createGreeter(控制台)
一次,并将该方法分配给类原型。第二个代码段在每次实例化类时对其进行求值,并将该方法分配给类实例,这会降低效率。

您能创建一个代码段来复制该问题吗?它工作于
Person.prototype.greet=createGreeter(控制台);风险值p1=新人(“abc”);p1.问候(“10”)??我知道这很有效。我在寻求一种更清晰或更短的方法来实现同样的结果。JS有很多方便的速记,我希望我在这个案例中错过了一个。你提到过,但这不起作用,显然对于
Person.prototype.greet=createGreeter(控制台)。你能重复一下吗?你的第二种方法对我来说很好。你发现了什么样的陷阱?@gurvinder372原型方法不是他所说的那种。它正在发挥作用,应该如此。但他只是给出了一个示例代码,只是为了举例说明,而这个示例代码是行不通的,他说,你能创建一个片段来复制这个问题吗?它工作于
Person.prototype.greet=createGreeter(控制台);风险值p1=新人(“abc”);p1.问候(“10”)??我知道这很有效。我在寻求一种更清晰或更短的方法来实现同样的结果。JS有很多方便的速记,我希望我在这个案例中错过了一个。你提到过,但这不起作用,显然对于
Person.prototype.greet=createGreeter(控制台)。你能重复一下吗?你的第二种方法对我来说很好。你发现了什么样的陷阱?@gurvinder372原型方法不是他所说的那种。它正在发挥作用,应该如此。他说,但他只是给出了一个示例代码,只是为了举例说明,这是行不通的;让一个属性返回一个函数确实很聪明!而且它被自动绑定到
这个
也很高兴知道。也很感谢完整的、可运行的代码片段,谢谢!我不得不承认,
get
的这种用法让我困惑了一段时间;让一个属性返回一个函数确实很聪明!而且它被自动绑定到
这个
也很高兴知道。也很感谢完整的、可运行的代码片段,谢谢!谢谢,你和帕特里克显然同时回答了同样的问题。真是聪明的解决方案。谢谢,你和帕特里克在sa的回答基本上是一样的