GeneratorFunctionPrototype should probably be a function

Allen Wirfs-Brock allen at wirfs-brock.com
Tue Aug 13 10:44:27 PDT 2013


On Aug 13, 2013, at 9:41 AM, André Bargull wrote:

>> Hi,
>> 
>> Section 15.19.3.3 of the July 15 draft says:
>> 
>>     Properties of the GeneratorFunction Prototype Object
>> 
>>     The GeneratorFunction prototype object is an ordinary object. It is
>>     not a function object and does not have a [[Code]] internal data
>>     property or any other of the internal data properties listed in
>>     Table 13. In addition to being the value of the prototype property
>>     of the %GeneratorFunction% intrinsic and is itself the %Generator%
>>     instrinsic.
>> 
>> See http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.19.3 for
>> the gnarlies.  To be explicit, we are talking about this object:
>> 
>>   var GeneratorFunctionPrototype = function*(){}.__proto__;
>> 
>> I think this object should be a function and not a normal object.
>> 
>>   1. The spec doesn't specify any other objects for which "x instanceof
>>      Function" that aren't functions.
> 
> Isn't that just because no other object inherits from the Function object in the specification? For example on the user level you can write `class MyFunction extends Function {}`, where `MyFunction.prototype instanceof Function` yields true, but `typeof MyFunction.prototype` is still "object". IIRC Allen even spec'ed GeneratorFunction similar to if it was written in the class syntax. 
> 

More generally, we've previously discussed and decided to break from the ES<6 convention that built-in prototype objects act as if they were instances of their associated constructors.  That generally won't be the case for prototypes defined using a class declarations.  We even decided to relax that requirement for the existing built-in, except where it would create backwards compat issues (Function.prototype and Array.prototype appear to be situations where there are such issues.)

instanceof is essentially broken when applied to most non-built-in prototype objects because they usually just aren't defined to proper operate as instances of the associated constructor.

> 
>>   2. Function.prototype.toString is the binding for ".toString()" on
>>      this object, but it is only applicable to function receivers.
> 
> The same restriction also applies to Number, String, Boolean, RegExp and Date (or rather to the corresponding prototype objects). So this is not a unique behaviour w.r.t. the GeneratorFunction prototype object. 
> 

same basic issue, many own or inherited prototype methods won't work on prototype objects.

Allen


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20130813/aa03deae/attachment.html>


More information about the es-discuss mailing list