On 04/11/2011, at 18:51, Jorge wrote:
> On 03/11/2011, at 23:55, Mark S. Miller wrote:
>> 3) Although SES is *formally* an object-capability language, i.e., it has
>> all the formal properties required by the object-capability model, it has
>> bad usability properties for writing defensive abstractions, and therefore
>> bad usability properties for use as an object-capability language or for
>> serious software engineering. One example:
>>
>> In a SES environment, or, for present purposes, an ES5/strict environment in
>> which all primordial built-in objects are transitively frozen, say Alice
>> uses the following abstraction:
>>
>> function makeTable() {
>> var array = [];
>> return Object.freeze({
>> add: function(v) { array.push(v); },
>> store: function(i, v) { array[i] = v; },
>> get: function(i) { return array[i]; }
>> });
>> }
>>
>> Say she uses it to make a "table" instance with three methods: add, store,
>> and get. She gives this instance to Bob. Alice and Bob are mutually
>> suspicious. All of us as programmers, looking at this code, can tell that
>> Alice intended the table abstraction to encapsulate the array. Given just a
>> table instance, can Bob nevertheless obtain direct access to the underlying
>> array?
>
> Yes, this:
>
> function makeTable() {
> var array = [];
> return Object.freeze({
> add: function(v) { array.push(v); },
> store: function(i, v) { array[i] = v; },
> get: function(i) { return array[i]; }
> });
> }
>
> o= makeTable();
> o.add(1);
> o.add(2);
> o.add(3);
> o.add('Yay!');
>
> o.store('__proto__', {push:function () { console.log(this) }});
Or even easier yet, what Axel says:
o.store('push', function () { console.log(this) });
> o.add();
>
> Gives:
>
> [ 1, 2, 3, 'Yay!' ]
[ 1, 2, 3, 'Yay!', push: [Function] ]
--
Jorge.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss