С одной стороны, я могу назначить новую функцию объекту с
Object.defineProperty(...)
.
Затем я попытался назначить функцию непосредственно прототипу NodeList. Но как-то не работает должным образом. Что я делаю не так?
Object.defineProperty(
NodeList.prototype,
'lastElement', {
get: function() {
return this[this.length - 1].textContent;
}
}
);
NodeList.prototype.firstElement = () => {
return this[0].textContent;
}
const h = document.querySelectorAll('span');
console.info('#last:', h.lastElement);
console.info('#first:', h.firstElement);
<div>
<span>1</span>
<span>2</span>
</div>
Стрелочные функции () => {...}
— это не просто другой синтаксис, который ведет себя одинаково, они фактически по-разному обрабатывают ключевое слово this
.
Если вы переключитесь на использование традиционного синтаксиса функции, this
будет вести себя так, как вы ожидаете.
Кроме того, вы определили firstElement
как обычную функцию, а не функцию-получатель, поэтому вам нужно будет вызывать ее следующим образом.
console.info('#first:', h.firstElement());
Object.defineProperty(
NodeList.prototype,
'lastElement', {
get: function() {
return this[this.length - 1].textContent;
}
}
);
NodeList.prototype.firstElement = function() {
return this[0].textContent;
}
const h = document.querySelectorAll('span');
console.info('#last:', h.lastElement);
console.info('#first:', h.firstElement());
<div>
<span>1</span>
<span>2</span>
</div>
Я так не думаю, я думаю, что вы ограничены методом, который вы использовали для lastElement
Спасибо за объяснение! Сегодня я кое-чему научился :-) Merci
Большое спасибо! Можно ли еще написать так, чтобы присваивающая функция все равно получала геттер? Чтобы я мог назвать это без
()
?