Public and private class fields
Several proposals expand the existing JavaScript class syntax with new functionality. This article explains the new public class fields syntax in V8 v7.2 and Chrome 72, as well as the upcoming private class fields syntax.
Here’s a code example that creates an instance of a class named IncreasingCounter
:
const counter = new IncreasingCounter();
counter.value;
// logs 'Getting the current value!'
// → 0
counter.increment();
counter.value;
// logs 'Getting the current value!'
// → 1
Note that accessing the value
executes some code (i.e., it logs a message) before returning the result. Now ask yourself, how would you implement this class in JavaScript? 🤔
ES2015 class syntax
Here’s how IncreasingCounter
could be implemented using ES2015 class syntax:
class IncreasingCounter {
constructor() {
this._count = 0;
}
get value() {
console.log('Getting the current value!');
return this._count;
}
increment() {
this._count++;
}
}
The class installs the value
getter and an increment
method on the prototype. More interestingly, the class has a constructor that creates an instance property _count
and sets its default value to 0
. We currently tend to use the underscore prefix to denote that _count
should not be used directly by consumers of the class, but that’s just a convention; it’s not really a “private” property with special semantics enforced by the language.