This is great stuff. Due to its breadth, however, it will have to wait until 
1.7.0.1, for which we've got a bunch of other ES5-compatibility fixes planned. 
If you and kangax think it would be worth getting the initially-proposed fix 
into 1.7, then I'll try my best to do so.

Cheers,
Andrew

On Oct 22, 2010, at 5:41 AM, Andy E wrote:

> That's great work.  I've found myself on your blog a few times in the
> last few weeks, but I hadn't seen this.  I hope you don't mind, I used
> it to update the example on my blog to:
> 
> (function () {
>    var hasOwnProperty = Object.prototype.hasOwnProperty,
>        hasDontEnumBug = true,
>        DontEnums = [
>            'toString',
>            'toLocaleString',
>            'valueOf',
>            'hasOwnProperty',
>            'isPrototypeOf',
>            'propertyIsEnumerable',
>            'constructor'
>        ],
>        DontEnumsLength = DontEnums.length;
> 
>    for (var k in {toString:null})
>        hasDontEnumBug = false;
> 
>    Object.keys = Object.keys || function (o) {
>        if (typeof o != "object" && typeof o != "function" || o ===
> null)
>            throw new TypeError("Object.keys called on a non-object");
> 
>        var result = [];
>        for (var name in o) {
>            if (hasOwnProperty.call(o, name))
>                result.push(name);
>        }
> 
>        if (hasDontEnumBug) {
>            for (var i = 0; i < DontEnumsLength; i--) {
>                if (hasOwnProperty.call(o, DontEnums[i]))
>                    result.push(DontEnums[i]);
>            }
>        }
> 
>        return result;
>    };
> })();
> 
> You may notice that I sacrificed one of your optimizations for
> brevity, I'm not sure the benefits would be noticeable in every day
> use.  A library like Prototype may benefit from such an optimization,
> however.
> 
> by the way, I noticed that your implementation will have problems when
> walking the DontEnum properties in Internet Explorer - it looks like
> you copied and pasted the line of code from the for...in loop to your
> for loop but forgot to change the variable that was passed in to the
> iterator function.
> 
>            iterator.call(context || iterator, prop, object[prop]); //
> References to `prop` should be `DontEnumProperties[i]`
> 
> Or store DontEnumProperties[i] in a variable for a small optimization.
> 
> On Oct 21, 9:48 pm, kangax <kan...@gmail.com> wrote:
>> On Oct 21, 12:11 pm, Andy E <andyearns...@gmail.com> wrote:
>> 
>>> kangax: I was thinking the same earlier (about caching the
>>> hasOwnProperty), when I realized that my method incorrectly doesn't
>>> allow functions to be passed (not sure about Prototype's original
>>> one).  I've updated the function on my blog to:
>> 
>>> Object.keys = Object.keys || function (o) {
>>>     if (typeof o != "object" && typeof o != "function" || o === null)
>>>         throw new TypeError("Object.keys called on a non-object");
>> 
>>>     var result = [], hop = Object.prototype.hasOwnProperty;
>> 
>> That's better, but nothing is stopping from taking it a step further,
>> aliasing `hasOwnProperty` outside of the method.
>> 
>>>     for (var name in o) {
>>>         if (hop.call(o, name))
>>>             result.push(name);
>>>     }
>>>     return result;
>> 
>>> };
>> 
>>> Regarding the DontEnum bug, you could work around that by checking
>>> them explicitly hasOwnProperty outside of the for...in loop.
>> 
>> Exactly ;)
>> 
>> See for example `Object.forIn()` that I experimented with a couple of
>> years ago (wow, how time flies...) 
>> —http://github.com/kangax/protolicious/blob/master/experimental/object...
>> 
>> Looking at the code now, I would simplify it slightly, but the idea
>> holds.
>> 
>> [...]
>> 
>> --
>> kangax
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Prototype: Core" group.
> To post to this group, send email to prototype-core@googlegroups.com
> To unsubscribe from this group, send email to 
> prototype-core-unsubscr...@googlegroups.com
> For more options, visit this group at 
> http://groups.google.com/group/prototype-core?hl=en

-- 
You received this message because you are subscribed to the Google Groups 
"Prototype: Core" group.
To post to this group, send email to prototype-core@googlegroups.com
To unsubscribe from this group, send email to 
prototype-core-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-core?hl=en

Reply via email to