On Nov 22, 2010, at 11:49 AM, Brendan Eich wrote: > On Nov 22, 2010, at 11:14 AM, Oliver Hunt wrote: >> And all existing standards compliant code can no longer rely on for in doing >> what it has done for years. Suddently for in _behaviour_ may change based >> on the prototype chain. > > That's true in Harmony,
I think I misread your "based on the prototype chain" words. I was making the general case for runtime semantic fixes -- few and worth making -- in Harmony as in ES5 strict. But I think you were supposing a proxy on a non-proxy's prototype chain could start returning non-string non-keys via its iterate trap. Not so. Here's a session with a fresh js shell (Firefox 4 latest code): js> var proxy = Proxy.create({ has: function () { return false; }, enumerate: function () { return ["a", "b", "c"]; }, iterate: function () { for (let i = 0; i < 10; i++) yield i; } }); js> js> var obj = Object.create(proxy); js> js> for (var i in proxy) print(i); 0 1 2 3 4 5 6 7 8 9 js> js> for (var i in obj) print(i); a b c Once for-in starts up a non-proxy object's prototype chain, only enumerate traps -- never iterate. And enumerate is fundamental, so if missing, the for in fails: js> var proxy = Proxy.create({ has: function () { return false; }, iterate: function () { for (let i = 0; i < 10; i++) yield i; } }); js> js> var obj = Object.create(proxy); js> js> for (var i in proxy) print(i); 0 1 2 3 4 5 6 7 8 9 js> js> for (var i in obj) print(i); typein:11: TypeError: enumerate is not a function /be _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss