Ваш вопрос сводится к тому, что ключевое слово this
означает внутри функции. Есть три варианта.
1. «Правильные» функции
this.son.addEventListener('mousedown', function() {
onMouseDown(event, this.brother);
});
Если вы определяете функцию с полным синтаксисом определения функции, function() {}
, тогда this
будет ссылаться на объект, через который вызывается функция. В случае прослушивателя событий это объект, для которого вы определили слушателя, который в вашем случае является div
, который вы создали. Это означает, что вы получите ошибку, потому что div
элементы не имеют свойства с именем brother
.
2. Функции стрелок
Функции стрелок были введены в последние годы и используют другой синтаксис:
this.son.addEventListener('mousedown', () => {
onMouseDown(event, this.brother);
});
Функции стрелок работают точно так же, как и «правильные» функции во всех отношениях, за одним исключением: они не имеют своих собственных this
, то есть this
будет ссылаться на все, к чему относится в области действия функции. определен. В вашем случае это будет ссылка на объект, который вы инициализируете в вашей функции Object()
. Это, вероятно, тот, который вы хотите.
(Примечание: вы действительно не должны называть свою функцию Object
, это имя уже занято базовым классом для всех объектов в JavaScript. Перезапись может вызвать всевозможные проблемы)
3. Связанные функции
Функции в JavaScript являются объектами, и поэтому они также имеют методы. Одним из них является bind()
, который позволяет вам создать связанную копию функции:
this.son.addEventListener('mousedown', (function() {
onMouseDown(event, this.brother);
}).bind(this));
Связанные функции также работают как «правильные» функции, за исключением того, что this
всегда будет ссылаться на объект, который вы передали в качестве аргумента bind()
. До функций со стрелками связанные функции раньше были наиболее распространенным способом обеспечения того, чтобы this
всегда ссылался на один и тот же объект в области действия. После появления функций со стрелками они начали терять популярность, поскольку функции со стрелками более эффективны и производят более читаемый код.