David Herman wrote:
On Aug 8, 2012, at 3:08 PM, Axel Rauschmayer wrote:

I'm not yet convinced that Object.update should be restricted to own 
properties. If you're only using object literals, then yeah, you want own 
properties only; you're basically using object literals as a poor man's named 
arguments. But if you're just taking an arbitrary object, there's less reason 
to expect that its relevant properties won't be inherited.
Can you elaborate? Because usually, you have instances that point to shared 
prototypes. Then you’d also want only the own properties. If there is a type 
hierarchy, all constructors put all instance data in the same object, so you 
already have an automatic flattening.

That's a fair point. I have found that I will occasionally have a type-level 
"constant" that makes sense to keep as an inherited data property, but I'll 
grant it's somewhat rare.

It's an anti-pattern, in general: constants go on constructors or in "package" objects. Too many colllision and deep-mutable hazards on the proto-chain for advisory constants.

Still, the fact that it works fine without the own-check today:

     http://james.padolsey.com/jquery/#v=1.7.2&fn=jQuery.extend

indicates that code is working fine today without prototype pollution problems 
(especially given that basically everything on the web breaks if you don't respect 
"Object.prototype is verboten").

I made the same argument but reached a different conclusion: proto-chain walking not wanted for Object.extend, because if people *did* extend Object.prototype, lots of for-in uses, especially including the one in Prototype's Object.extend, would break.

So before going with the own-check, I'd want to know that existing patterns 
wouldn't break, and whether it really would help that much.

This is not a case of us knowing too little, or having a neutral stance in the face of a balanced controversy. Object.prototype is verboten *because* for-in walks the proto chain, *and* it's used by Object.extend and other such things. Plus, people don't generally compose via __proto__ (Object.create is new) or flatten proto-chains intentionally.

/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to