traits are now impossible in ES6 until ES7 since rev32?

Ben Newman benjamin at
Fri Feb 6 09:04:30 PST 2015

The specific line in rev32 of the spec that prevents [[Call]]ing
"classConstructor" functions is

2. If *F*’s [[FunctionKind]] internal slot
 is "classConstructor", throw a *TypeError* exception.

>From my reading of the spec, I think the idiomatic pattern
that Luke Scott described would work if we simply changed that line to
something slightly weaker:

2. If *F*’s [[FunctionKind]] internal slot
 is "classConstructor" and InstanceofOperator
(*thisArgument*, *F*) is *false,* throw a *TypeError* exception.

This mirrors an assertion discipline that has saved me from many bugs due
to forgetting the new operator:

function Base() {
  *assert.ok(this instanceof Base);*

function Derived() {
  *assert.ok(this instanceof Derived);*;

Derived.prototype = Object.create(Base.prototype, {
  constructor: { value: Derived, ... }

Is the addition of the instanceof check naive? Would it invalidate any of
the assumptions involved in the invocation of F?

I'm happy to file a bug if this change merits further consideration.

It may be worth noting that only constructors created by class syntax will
have their [[FunctionKind]] internal slot set to "classConstructor", so
(even with the current spec) you can still invoke ordinary constructor
functions using [[Call]]. However, it seems regrettable that you have to
know whether a constructor was created by class syntax in order to know
whether the pattern is safe.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the es-discuss mailing list