torna alle lezioni

Aggiungi toString al dizionario

importanza: 5

Abbiamo un oggetto dictionary, creato come Object.create(null), in cui memorizziamo coppie key/value.

Aggiungi un metodo dictionary.toString(), il quale dovrebbe ritornare un lista di chiavi separate da virgola. Il metodo toString non deve essere mostrato nei cicli for..in.

Dovrebbe funzionare così:

let dictionary = Object.create(null);

// il tuo codice per aggiungere il metodo toString

// aggiungiamo dei valori
dictionary.apple = "Apple";
dictionary.__proto__ = "test"; // __proto__ è una proprietà comune in questo caso

// nel ciclo compaiono solo apple e __proto__
for(let key in dictionary) {
  alert(key); // "apple", poi "__proto__"
}

// la tua implementazione di toString in azione
alert(dictionary); // "apple,__proto__"

Il metodo Object.keys mostra tutte le proprietà enumerabili di un oggetto.

Per rendere toString non-enumerable, dobbiamo definirlo utilizzando un property descriptor. La sintassi che ci permette di farlo è Object.create, che ci consente di fornire dei property descriptors come secondo argomento.

let dictionary = Object.create(null, {
  toString: { // definiamo la proprietà toString
    value() { // il valore è una funzione
      return Object.keys(this).join();
    }
  }
});

dictionary.apple = "Apple";
dictionary.__proto__ = "test";

// apple e __proto__ appaiono nel ciclo
for(let key in dictionary) {
  alert(key); // "apple", poi "__proto__"
}

// vengono elencate le proprietà separate da una virgola
alert(dictionary); // "apple,__proto__"

Possiamo crare una proprietà utilizzando un descriptor. Di default i flag vengono impostati a false. Quindi nel codice sopra, dictionary.toString è non-enumerable.

Vedi il capitolo property descriptors se hai bisogno di ripassare l’argomento.