Допустим, у меня есть функция, которая возвращает такую функцию:
function createGreeter(logger) {
return function greet(greeting) {
logger.log(greeting + ', ' + this.name);
}
}
И класс
class Person {
constructor(name) {this.name = name;}
}
Если я хочу назначить метод приветствия классу 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
, будет создаваться новый объект функции, хотя мы всегда хотим передавать ему одни и те же параметры (console
). Таким образом, еще один подход может состоять в том, чтобы объявить const consoleGreeter = createGreeter(console)
перед определением класса и реализовать приветствие как return consoleGreeter.call(this, greeting)
, но стоит ли это того?
Person.prototype.greet = createGreeter(console); var p1 = new Person( "abc" ); p1.greet( "10" );
- person gurvinder372   schedule 19.12.2017Person.prototype.greet = createGreeter(console);
. Можете ли вы повторить это? - person gurvinder372   schedule 19.12.2017