我们说我有一个返回这样一个函数的函数:
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)
,但它是否值得呢?
答案 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)
一次并将方法分配给类原型。第二个片段在每次实例化类时对其进行求值,并将该方法分配给类实例,效果较差。