Is private really private?
Only if that code appears appears within the text of the class of which objectWithPrivateFoo is an instance. "foo" is what we call a "class private instance variable", which is essentially the same degree of encapsulation as Java's "private" fields -- instances of the class can see into other instances of the same class.
If this code appears outside any class, it would be a syntax error. If it appears within a class other that the class of objectWithPrivateFoo, then private(this) returns undefined and private(this).foo thereby throws a TypeError.
In the presence of inheritance, again the right analogy is Java's "private". If objectWithPrivateFoo is an instance of C which inherits from B which inherits from A, and if all of them contribute a private member named "foo" to the instance's state, and if your code appears within the text of B, then your expression will evaluate to the "foo" that B contributed to the state of objectWithPrivateFoo.
Hello,
"Only if that code appears appears within the text of the class ClassWithPrivateFoo" means "only inside class {...} block that defines ClassWithPrivateFoo"? So ES.next private could be seen as sugar for "lexical private in scope of class block"?
Herby
-----Pôvodná správa---
On Tue, Jan 3, 2012 at 8:45 AM, Herby Vojčík <herby at mailbox.sk> wrote:
Hello,
"Only if that code appears appears within the text of the class ClassWithPrivateFoo" means "only inside class {...} block that defines ClassWithPrivateFoo"? So ES.next private could be seen as sugar for "lexical private in scope of class block"?
Yes, exactly. Thanks for the clear summary.
Hello,
form what I understood in the class proposal, I can write a code like this:
(function () { return private(this).foo; }).apply(objectWithPrivateFoo);
and it will work. Is it so? Isn’t then the notion of "per-object private" impossible having dynamic language with first-class function and apply/call?