JSFiddle - React, Tailwind, and code Playground
JavaScript
circle = {
constructor: function (radius) {
circle.private_implementation.call(this.private_data,this);
if (radius) this.radius = radius;
this.circlesMade++;
return this;
},
draw: function (circle, canvas) {
// Canvas drawing code
},
get circlesMade () {
return !circle._count ? 0 : circle._count;
},
set circlesMade (val) {
circle._count = val;
},
area: function () {
return Math.pow(this.radius, 2) * Math.PI;
},
private_data: {}, private_implementation: function (pub) {
var _radius = 0;
pub._get_radius = function () {
return _radius;
};
pub._set_radius = function (radius) {
if (!Number.isInteger(radius))
throw new Error("Circle radius must be an integer.");
_radius = radius;
};
Object.defineProperty(pub, 'radius', {
get: pub._get_radius,
set: pub._set_radius
});
},
}
myring = Object.create(circle).constructor(42);
alert('getter to private data (42): '+myring.radius);
alert('private data unavailable: '+myring._radius);
alert('normal public method: '+myring.area());
alert('static data (1 created): '+myring.circlesMade);
myring2 = Object.create(circle).constructor();
alert('second item unique data (0): '+myring2.radius);
alert('original data still unique (42): '+myring.radius);
myring2 = Object.create(circle).constructor(42);
alert('static data is global (3 created): '+myring.circlesMade);