javascript - ES6 getter/metode uten krøllete parenteser
Jeg har noen klasser som består av mange korte getters/metoder.
Eksempel :
get jQuery() {
return this.pageConfig.jQuery || jQuery;
}
En pilfunksjon med lignende innhold kan skrives som følger:
() => this.pageConfig.jQuery || jQuery;
Som er en én-linjes uttalelse og dermed bare bruker 1/3 av vertikal plass.
Men det er verken en getter eller en metode.
Finnes det en anbefalt måte å skrive getters/metoder på i form av én-linje-uttrykk? (hvis mulig uten krøllparenteser og uten return-nøkkelordet)
Mine getters og metoder trenger ikke å endre objektet. De leser bare.
Svar #1
For en enkeltlinje, gå bare for dette:
get jQuery() {return this.pageConfig.jQuery || jQuery;}
Pilfunksjoner er ikke for metode-definisjoner fordi de bruker leksikalsk this, mens en metode ønsker objektets this. Husk at selv om pilfunksjoner er en praktisk forkortelse, påvirker de også verdien av this på en måte som vanligvis ikke er kompatibel med metode-definisjoner.
Svar #2
Nei, det er ingenting kortere enn (du kan hoppe over ;)
get jQuery() { return this.pageConfig.jQuery || jQuery }
Litt mer forklaring
Du kan ikke bruke piltasten-funksjonen (() => this.pageConfig.jQuery || jQuery), fordi for det første er det ikke en getter-funksjon, og this refererer ikke til objektets kontekst, men til kjøringskonteksten (som kan være objektet, men ikke nødvendigvis.
Det finnes/fantes __defineGetter__-funksjonen (noe dokumentasjon) som lar deg definere en getter. Den er nå utdatert og vil sannsynligvis være enda mer kompleks enn get. Men som dokumentasjonen sier, brukes den mye og vil sannsynligvis aldri bli fjernet.
Heldigvis for deg: Jeg er helt for vanvittige løsninger
class Test {
constructor() {
this.pageConfig = {}
this.pageConfig.jQuery = "value"
let properties = {
'jQuery': () => this.pageConfig.jQuery || "Default",
'text': () => this.pageConfig.text || "Default"
}
for(let prop in properties) this.__defineGetter__(prop, properties[prop])
}
}
let t = new Test
console.log(t.jQuery)
console.log(t.text)Glad enkel linje (men ærlig talt bruk bare get fra ECMA 5)
