Whoever told you this couldn't be done was lying.
By utilising closures we can create a class that holds its own private members which cannot be accessed outside of that class - even by adding a new function onto the class
Consider the following javascript function
function Outer()
{
var PrivateVar='PrivateValue';
function Inner()
{
PrivateVar='Some Value';
}
}
This is known as a closure.
You can read more about them here:
http://stackoverflow.com/questions/111102/how-do-javascript-closures-work
Put simply the inner function has access to the variables in the outer function.
These variables are "live" - that is they are not fixed when the inner function was created.
Now consider that the Outer and Inner functions are, in fact, constructors
function MyClassWithPrivateVars(params)
{
var PrivateVar;
function MyClass(params)
{
PrivateVar='Initial Value';
}
return new MyClass(params);
}
var Instance = new MyClassWithPrivateVars('whatever');
When you call the outer constructor you are actually calling the inner constructor.
The inner constructor has access to the vars within the outer constructor as before.
Let's add a method to the inner constructor.
This new method of course has access to the variables in the outer constructor.
In this instance the method is a "property".
function MyClassWithPrivateVars(params)
{
var PrivateVar;
function MyClass(params)
{
PrivateVar='Initial Value';
this.PublicProperty = function(value)
{
if (typeof(value)!=="undefined")
{
PrivateVar=value;
}
return PrivateVar;
}
}
return new MyClass();
}
Now if we create an instance of MyClassWithPrivateVars
and invoke the property we'll see that it gets the value as expected.
var MyInstance=new MyClassWithPrivateVars();
console.log(MyInstance.PublicProperty());
Outputs "Initial Value"
because the private variable was set to that value in the constructor.
MyInstance.PublicProperty(10);
console.log(MyInstance.PublicProperty());
This time we get 10
So is the variable really private?
Well - let's try and access it directly:
console.log(MyInstance.PrivateVar);
This should output undefined
as PrivateVar is not a member of the inner class.
Likewise
console.log(MyClassWithPrivateVars.PrivateVar);
is also undefined because PrivateVar is a member of the instance of the outer class - not of the constructor itself.