javascript - ES6 getter/metodi ilman aaltosulkeita


Minulla on joitakin luokkia, jotka koostuvat monista lyhyistä getteristä/metodeista.

Esimerkki :

get jQuery() {
  return this.pageConfig.jQuery || jQuery;
}

Nuolifunktio, jolla on samanlainen sisältö, voidaan kirjoittaa seuraavasti:

() => this.pageConfig.jQuery || jQuery;

Joka on yksirivinen ja siksi vie vain 1/3 pystysuorasta tilasta.

Mutta se ei ole getter eikä metodi.

Onko suositeltu tapa kirjoittaa getters/metodeja yhdelle riville? (jos mahdollista ilman aaltosulkeita ja ilman return-avainsanaa)

Gettereideni ja metodieni ei tarvitse muokata oliota. Ne vain lukevat.

Vastaus #1

Yhdelle riville, mene vain tämän kanssa:

get jQuery() {return this.pageConfig.jQuery || jQuery;}

Nuolitoiminnot eivät sovi metodien määrittelyyn, koska ne käyttävät leksikaalista this-avainsanaa, kun taas metodi haluaa objektin this-viittauksen. Muista, että vaikka nuolitoiminnot ovat kätevä lyhennys, ne vaikuttavat myös this-arvoon tavalla, joka ei yleensä ole yhteensopiva metodien määrittelyjen kanssa.

Vastaus #2

Ei, ei ole mitään lyhyempää kuin (voit ohittaa ;)

get jQuery() { return this.pageConfig.jQuery || jQuery }

Vähän enemmän selitystä

Et voi käyttää nuolitoimintoa ( () => this.pageConfig.jQuery || jQuery ), koska ensinnäkin se ei ole getter-funktio ja this ei viittaa objektin kontekstiin vaan suoritusympäristön kontekstiin (joka voi olla objekti mutta ei välttämättä ole).

On olemassa/oli __defineGetter__-funktio (joitakin dokumentaatioita), joka sallii getterin määrittämisen. Se on nyt vanhentunut ja olisi todennäköisesti vielä monimutkaisempi kuin get. Mutta kuten dokumentaatio sanoo, sitä käytetään laajasti eikä sitä todennäköisesti koskaan poisteta.

Onneksi sinulle: kannatan täysin hulluja ratkaisuja

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)

Hauska yksirivinen (mutta rehellisesti käytä vain get-metodia ECMA 5:sta)

Aiheeseen liittyviä artikkeleita