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);