Uczymy się „return this” czyli pisania metod, które można chainować. Na przykładzie z poprzedniej lekcji. Do dzieła.
Poprzednia klasa:
class Helper {
constructor(selector) {
this.item = document.getElementById(selector);
}
toUpper(){
let txt = this.item.textContent;
if(this.item.firstChild.nodeType === Node.TEXT_NODE){
this.item.textContent = txt.toUpperCase();
}else {
this.item.firstChild.textContent = txt.toUpperCase();
}
}
toBold(){
let txt = this.item.textContent;
this.item.innerHTML = "<b>" + txt + "</b>";
}
}
window.addEventListener("DOMContentLoaded", function(){
let para = new Helper('para');
console.log(para.item.innerHTML);
//bla bla bla
para.toBold();
para.toUpper();
console.log(para.item.innerHTML);
//<b>BLA BLA BLA</b>
});
Dodamy jeszcze jedną metodę:
class Helper {
//(...)
incrementFS(unit='px', by=1){
let computed = getComputedStyle(this.item);
let fs = computed.getPropertyValue('font-size');
let fsNumber = parseInt(fs);
let newSize = `${fsNumber+by}${unit}`;
this.item.style.fontSize = newSize;
}
}
Teraz dodamy „return this” do tych metod, które chcemy chainować:
class Helper {
constructor(selector) {
this.item = document.getElementById(selector);
}
toUpper(){
//(...)
return this;
}
toBold(){
//(...)
return this;
}
incrementFS(unit='px', by=1){
//(...)
return this;
}
}
Mała uwaga – konstruktor zawsze zwraca this i to bez naszego określania typu zwrotnego. Aczkolwiek robi to w połączeniu ze słówkiem kluczowym new.
Ok, testujemy:
window.addEventListener("DOMContentLoaded", function(){
let para = new Helper('para');
para.toBold()
.toUpper()
.incrementFS()
.incrementFS()
.incrementFS();
});
Działa jak należy – metody można chainować.