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?
The function keyword is replaced with the class keyword. There's a special function named 'constructor' where the initialization of the object is done.
Definition and UsageThe extends keyword is used to create a child class of another class (parent). The child class inherits all the methods from another class. Inheritance is useful for code reusability: reuse properties and methods of an existing class when you create a new class.
The instanceof operator tests to see if the prototype property of a constructor appears anywhere in the prototype chain of an object. The return value is a boolean value. Its behavior can be customized with Symbol. hasInstance .
ES6 doesn't support multiple inheritance. Multi-level − Consider the following example.
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
Stoprototype.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With