Consider the following ES6 Classes:
'use strict';
class Dummy {
}
class ExtendDummy extends Dummy {
constructor(...args) {
super(...args)
}
}
class ExtendString extends String {
constructor(...args) {
super(...args)
}
}
const ed = new ExtendDummy('dummy');
const es = new ExtendString('string');
console.log(ed instanceof ExtendDummy);
console.log(es instanceof ExtendString);
My understanding is that both should be true
, and in Firefox and Chrome they are, however Node says es instanceof ExtendString
is false
. It's the same with other constructors, not just String
.
Software I used:
--harmony
flag.Which JavaScript engine is correct and why?
Node appears to be incorrect, es instanceof ExtendString
should definitely be true
(like everyone would expect).
String[Symbol.hasInstance]
is not overwritten, and Object.getPrototypeOf(es)
should be ExtendedString.prototype
, as the spec details this in the String (value)
function description:
- Return StringCreate(
s
, GetPrototypeFromConstructor(NewTarget,"%StringPrototype%"
)).
The newtarget refers to ExtendString
when you construct the new ExtendString('string')
instance, and since it is a constructor with a .prototype
object it will use ExtendedString.prototype
not %StringPrototype
as the [[prototype]] for the newly created exotic String object:
- Set the [[Prototype]] internal slot of
S
toprototype
.