> On Jul 9, 2011, at 7:22 PM, Brendan Eich wrote:
> 
>> On Jul 9, 2011, at 5:02 PM, Allen Wirfs-Brock wrote:
...
>> 1) stratification -  Proxy.isProxy is an example
>> 2) It is impossible or inconvenient to add the classification interface to 
>> the appropriate instance interface.  I think that was the reason for 
>> Array.isArray.  We were more afraid of adding it to Array.prototype than to 
>> Array.
> 
> That's too bad, since we added Function.prototype.isGenerator (which as I 
> noted last time shows up on Function, of course!) without problem. It's 
> Object.prototype that people can't extend, and then the warning about other 
> built-ins is pre-ES5, out of lack of enumerable control, so for fear of 
> breaking for-in loops.
> 
> Adding a non-enumerable Array.prototype method seems doable to me, if the 
> name is clear and not commonly used.


We can probably still add Array.prototoype.isArray if that would help to 
establish the pattern. Document as being preferred over Array.isArray

> 
>> 
>> Well, if you were actually using Proxy to implement Array, you would 
>> probably also be providing the Array implementation.
> 
> Not necessarily -- you might just want isArray to return true for your 
> proxied fakes and the real deal. But yes, you would have to provide at least 
> Array.isArray. With all the standard methods on Array.prototype generic, I 
> believe you wouldn't have to replace all of Array.

but if you want (new Array()) to create the fakes...

> 
>> However, arguably Array.isArray really should have been 
>> Array.prototype.isArray.  We treated as a case 2 from above.  May we really 
>> didn't need to, but that's water over dam.  I don't think we should use it 
>> as precedent for more greenfield situations.
> 
> First thought: Crock sold us on reformed Number.is{NaN,Finite} along with new 
> Numer.isInteger. We can "do both" and correct course for the long run, 
> perhaps: Array.isArray and Array.prototype.isArray. But first we should 
> settle the data property vs. method issue.

yes.  I wonder if isArray and isInteger are different kinds of categorizations 
("class" based vs value based) that perhaps should have distinct naming 
conventions.

>>> 
>> 
>> But f the method implementation is simply going to be return true or return 
>> false why do yo need to call it at all?
> 
> The general case is an optional method, a notification hook call-out or some 
> such.
> 
> You're right that for object detection the method call seems a waste. We 
> could have made Function isGenerator a non-writable, non-configurable, and 
> non-enumerable boolean-valued data property.
> 
> But, then it would be an instance property, which burns storage (the shape or 
> hidden class sharing is not the issue, the true or false value slot is); or 
> else an accessor on Function.prototype, which is about as costly as a method 
> in implementations. Users testing it would not have to write (), your point. 
> That wins. But otherwise it's a wash.

Why not a non-writable,non-enumerable non-configurable data property on 
Function.prototype.

> 
> 
>> Smalltalk code guidelines would general say (but I'll use JS syntax here 
>> instead of Smalltalk):
>> 
>> 
>> obj.isFoo    //ok
>> obj.constructor.isFoo(obj)  //less ok, unless there is a good reason
>> Foo.isFoo(obj)   //even less good
>> 
>> In the first two you are only statically coupled to obj
>> in the third you are statically coupled to both obj and Foo.
> 
> Right, and as you say there may be a reason for that (reasons 1 and 3; not 
> sure about 2).
and I should have included:
   obj.constructor === Foo   //very bad 

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

Reply via email to