Met Javascript is het mogelijk om private variabelen te simuleren door middel van scoping. Dit is als volgt te implementeren:
In dit geval is de variabele bar in een Foo object alleen benaderbaar via de getBar en setBar methoden. Ik gebruik dit regelmatig en het werkt goed voor singletons. Als ik echter meerdere instanties van Foo maak, dan wordt de bar variabele helaas gedeeld en dat levert ongewenst gedrag op. Onderstaande code illustreert dit:
Zoals de comments aangeven verwacht ik bij de laatste alert uiteraard een 3 i.p.v. 4.
Nu kan ik op internet voorbeelden vinden van het creëren van meerdere instanties door middel van Object.create waarbij de methoden netjes op het prototype gedefinieerd zijn (bijv. deze), maar ik zou graag variabelen afschermen in sommige van mijn objecten.
Heeft iemand een idee hoe ik variabelen afschermen voor prototypes waar meerdere instanties van worden aangemaakt, zonder dat de waarden van deze variabelen gedeeld worden tussen de instanties?
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
| var Foo = (function () { var bar; return { getBar: function () { return bar; }, setBar: function (b) { bar = b; } }; })(); |
In dit geval is de variabele bar in een Foo object alleen benaderbaar via de getBar en setBar methoden. Ik gebruik dit regelmatig en het werkt goed voor singletons. Als ik echter meerdere instanties van Foo maak, dan wordt de bar variabele helaas gedeeld en dat levert ongewenst gedrag op. Onderstaande code illustreert dit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
| var foo1 = Object.create(Foo); foo1.setBar(3); alert(foo1.getBar()); // alerts '3', OK var foo2 = Object.create(Foo); foo2.setBar(4); alert(foo2.getBar()); // alerts '4', OK alert(foo1.getBar()); // alerts '4', NOT OK! |
Zoals de comments aangeven verwacht ik bij de laatste alert uiteraard een 3 i.p.v. 4.
Nu kan ik op internet voorbeelden vinden van het creëren van meerdere instanties door middel van Object.create waarbij de methoden netjes op het prototype gedefinieerd zijn (bijv. deze), maar ik zou graag variabelen afschermen in sommige van mijn objecten.
Heeft iemand een idee hoe ik variabelen afschermen voor prototypes waar meerdere instanties van worden aangemaakt, zonder dat de waarden van deze variabelen gedeeld worden tussen de instanties?