Этот пример работает, как и ожидалось:
class A {
constructor(name) {
this.name = name
}
}
A.prototype.someMethod1 = function() { console.log("1: " + this.name) }
A.prototype.someMethod2 = function() { console.log("2: " + this.name) }
let a = new A("John")
a.someMethod1()
a.someMethod2()
Иногда нам нужно сгруппировать методы по значению в дочерние объекты, чтобы вызвать их следующим образом: a.some.method1 (), a.some.method2().Давайте попробуем написать:
class A {
constructor(name) {
this.name = name
}
}
A.prototype.some = {
method1: function() { console.log("1: " + this.name) },
method2: function() { console.log("2: " + this.name) }
}
Теперь мы можем вызвать a.some.method1 () и a.some.method2 (), но «this» внутри него указывает на «a.some» ине "а", как хотелось бы.Итак, «this.name» внутри этих методов теперь будет «неопределенным».
Так можно ли связать контекст методов с основным объектом?
В настоящее время я знаю только один способ сделать это.Примерно так в конструкторе:
class A {
constructor(name) {
this._name = name
// bind context to this
Object.keys(this.name).forEach(n => {
this.name[n] = this.name[n].bind(this)
})
}
}
Но есть ли более элегантные методы?
Примечание: он должен быть указан во время объявления.Модификации вызовов методов, такие как a.some.method1 (). Call (a), недопустимы.