How to share private members among common instances in JavaScript?

In JavaScript, private members are variables that cannot be accessed directly from outside a constructor function or class. However, you can share private members among instances using closures and static variables.

Understanding Private Members

Private members are created using local variables inside constructor functions. They can only be accessed through public methods defined within the same scope.

Example: Basic Private Members

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Private Members Example</title>
</head>
<body>
    <h1>Share Private Members Among Common Instances</h1>
    <div id="result"></div>
    <button onclick="displayPersonData()">Show Person Data</button>

    <script>
        function Person(name) {
            let personName = name; // Private member
            
            this.returnName = function() {
                return personName;
            };
        }

        let person1 = new Person("Rohan");
        let person2 = new Person("Shawn");

        function displayPersonData() {
            const result = document.getElementById("result");
            result.innerHTML = 
                "person1.returnName() = " + person1.returnName() + "<br>" +
                "person2.returnName() = " + person2.returnName() + "<br>" +
                "person1.personName = " + person1.personName + "<br>" +
                "person2.personName = " + person2.personName;
        }
    </script>
</body>
</html>

Output

person1.returnName() = Rohan
person2.returnName() = Shawn
person1.personName = undefined
person2.personName = undefined

Sharing Private Members Using Closures

To share private data among all instances, you can use an IIFE (Immediately Invoked Function Expression) to create a shared closure:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shared Private Members</title>
</head>
<body>
    <h1>Shared Private Members Example</h1>
    <div id="shared-result"></div>
    <button onclick="testSharedMembers()">Test Shared Members</button>

    <script>
        const PersonWithShared = (function() {
            let instanceCount = 0; // Shared private member
            let instances = []; // Shared array

            function Person(name) {
                let personName = name;
                instanceCount++;
                instances.push(this);

                this.getName = function() {
                    return personName;
                };

                this.getInstanceCount = function() {
                    return instanceCount;
                };

                this.getAllInstances = function() {
                    return instances.length;
                };
            }

            return Person;
        })();

        function testSharedMembers() {
            const person1 = new PersonWithShared("Alice");
            const person2 = new PersonWithShared("Bob");
            const person3 = new PersonWithShared("Charlie");

            const result = document.getElementById("shared-result");
            result.innerHTML = 
                "person1.getName() = " + person1.getName() + "<br>" +
                "person2.getName() = " + person2.getName() + "<br>" +
                "person3.getName() = " + person3.getName() + "<br>" +
                "Total instances (from person1): " + person1.getInstanceCount() + "<br>" +
                "Total instances (from person2): " + person2.getInstanceCount() + "<br>" +
                "All instances count: " + person3.getAllInstances();
        }
    </script>
</body>
</html>

Output

person1.getName() = Alice
person2.getName() = Bob  
person3.getName() = Charlie
Total instances (from person1): 3
Total instances (from person2): 3
All instances count: 3

Key Points

  • Private members are created using local variables inside constructor functions
  • They cannot be accessed directly from outside the constructor
  • Use closures and IIFE patterns to share data among all instances
  • Shared private members maintain their state across all instances

Conclusion

Private members in JavaScript provide encapsulation, while closures enable sharing data among instances. This pattern is useful for maintaining shared state like counters or configuration data across all instances of a constructor function.

Updated on: 2026-03-15T23:18:59+05:30

174 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements