> On May 31, 2016, at 3:25 AM, Logan Smyth <loganfsm...@gmail.com> wrote:
> 
> The correct spec behavior is to return an instance of `MyError`. Step 7 in 
> your example is not equivalent to calling `Error` without `new`, which seems 
> to be your assumption. The `newTarget` parameter passed to `Construct` is 
> used to determine the prototype of the final object, and in this context 
> `newTarget` would be `MyError`.
> 
> Babel does not support extending builtins by default because it is difficult 
> to transpile properly and would add more boilerplate in all class cases, even 
> those which do not require logic to handle native extension. If you need 
> builtin extension support, the only way at the moment is to explicitly enable 
> it via a plugin like 
> https://www.npmjs.com/package/babel-plugin-transform-builtin-extend 
> <https://www.npmjs.com/package/babel-plugin-transform-builtin-extend>
> 
> On Mon, May 30, 2016 at 11:56 PM, Gray Zhang <otakus...@gmail.com 
> <mailto:otakus...@gmail.com>> wrote:
> I know NodeJS outputs `true` in this case, but my problem is from the spec it 
> seems `false` is the correct result, or am I missing some chapters in spec?
> 
> Jordan Harband <ljh...@gmail.com <mailto:ljh...@gmail.com>>于2016年5月31日周二 
> 下午2:47写道:
> In which engine did you try this? Please refer to 
> http://kangax.github.io/compat-table/es6/ 
> <http://kangax.github.io/compat-table/es6/> under "Subclassing" to see if 
> your browser supports subclassing builtins yet.
> 
> On Mon, May 30, 2016 at 11:32 PM, Gray Zhang <otakus...@gmail.com 
> <mailto:otakus...@gmail.com>> wrote:
> Recently I encountered an issue about subclassing Error and instance 
> operator, my simplified code is:
> 
> ```
> class MyError extends Error {
>   constructor() {
>     super('my error’);
>   }
> }
> 
> let error = new MyError();
> console.log(error instanceof MyError);
> console.log(error.constructor);
> ```
> 
> Surprisingly the output is `false` and `function Error() { [native code] }`
> 
> I dived into the ECMAScript 2015 spec and find the behavior is correct, 
> chapter 12.3.5.1 says:
> SuperCall : super Arguments
> Let newTarget be GetNewTarget 
> <http://www.ecma-international.org/ecma-262/6.0/index.html#sec-getnewtarget>().
> If newTarget is undefined, throw a ReferenceError exception.
> Let func be GetSuperConstructor 
> <http://www.ecma-international.org/ecma-262/6.0/index.html#sec-getsuperconstructor>().
> ReturnIfAbrupt 
> <http://www.ecma-international.org/ecma-262/6.0/index.html#sec-returnifabrupt>(func).
> Let argList be ArgumentListEvaluation of Arguments.
> ReturnIfAbrupt 
> <http://www.ecma-international.org/ecma-262/6.0/index.html#sec-returnifabrupt>(argList).
> Let result be Construct 
> <http://www.ecma-international.org/ecma-262/6.0/index.html#sec-construct>(func,
>  argList, newTarget).
> ReturnIfAbrupt 
> <http://www.ecma-international.org/ecma-262/6.0/index.html#sec-returnifabrupt>(result).
> Let thisER be GetThisEnvironment 
> <http://www.ecma-international.org/ecma-262/6.0/index.html#sec-getthisenvironment>(
>  ).
> Return thisER.BindThisValue 
> <http://www.ecma-international.org/ecma-262/6.0/index.html#sec-bindthisvalue>(result).
> Since Error can be called as a function without new operator, the result of 
> step 7 is an error instance rather than undefined, so this error instance 
> becomes `this` value of `thisER` and then returned as the result of new 
> MyError constructor.


Huh??  Step 7  isn’t a [[Call]] it is a [[Construct]].  Syntactic rules such as 
“must use new to invoke a constructor” can’t apply at the level of pseudo-code.

> 
> The problem is, the spec also said "The Error constructor is designed to be 
> subclassable." so I think instanceof should work correctly on subclasses, 
> however it fails now.

It is specified to work.  Your implementation must be wrong or imp complete.


> 
> This also comes to Map, Set, Array and Object constructors.

Also should work

Allen

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to