Ich bin auf diesen Beitrag gestoßen, als ich nach bewährten Methoden für "private Daten für Klassen" gesucht habe. Es wurde erwähnt, dass einige der Muster Leistungsprobleme haben könnten.
Ich habe einige jsperf-Tests basierend auf den 4 Hauptmustern aus dem Online-Buch "Exploring ES6" erstellt:
http://exploringjs.com/es6/ch_classes.html#sec_private-data-for-classes
Die Tests finden Sie hier:
https://jsperf.com/private-data-for-classes
In Chrome 63.0.3239 / Mac OS X 10.11.6 waren die leistungsstärksten Muster "Private Daten über Konstruktorumgebungen" und "Private Daten über eine Namenskonvention". Safari hat für WeakMap gut abgeschnitten, aber nicht so gut Chrome.
Ich kenne den Speicherplatz nicht, aber das Muster für "Konstruktorumgebungen", vor dem einige gewarnt hatten, dass es ein Leistungsproblem geben könnte, war sehr leistungsstark.
Die 4 grundlegenden Muster sind:
Private Daten über Konstruktorumgebungen
class Countdown {
constructor(counter, action) {
Object.assign(this, {
dec() {
if (counter < 1) return;
counter--;
if (counter === 0) {
action();
}
}
});
}
}
const c = new Countdown(2, () => {});
c.dec();
c.dec();
Private Daten über Konstruktorumgebungen 2
class Countdown {
constructor(counter, action) {
this.dec = function dec() {
if (counter < 1) return;
counter--;
if (counter === 0) {
action();
}
}
}
}
const c = new Countdown(2, () => {});
c.dec();
c.dec();
Private Daten über eine Namenskonvention
class Countdown {
constructor(counter, action) {
this._counter = counter;
this._action = action;
}
dec() {
if (this._counter < 1) return;
this._counter--;
if (this._counter === 0) {
this._action();
}
}
}
const c = new Countdown(2, () => {});
c.dec();
c.dec();
Private Daten über WeakMaps
const _counter = new WeakMap();
const _action = new WeakMap();
class Countdown {
constructor(counter, action) {
_counter.set(this, counter);
_action.set(this, action);
}
dec() {
let counter = _counter.get(this);
if (counter < 1) return;
counter--;
_counter.set(this, counter);
if (counter === 0) {
_action.get(this)();
}
}
}
const c = new Countdown(2, () => {});
c.dec();
c.dec();
Private Daten über Symbole
const _counter = Symbol('counter');
const _action = Symbol('action');
class Countdown {
constructor(counter, action) {
this[_counter] = counter;
this[_action] = action;
}
dec() {
if (this[_counter] < 1) return;
this[_counter]--;
if (this[_counter] === 0) {
this[_action]();
}
}
}
const c = new Countdown(2, () => {});
c.dec();
c.dec();