5

考虑以下 ES6 类:

'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);

我的理解是两者都应该是true,在 Firefox 和 Chrome 中它们是,但是 Node 说es instanceof ExtendStringfalse。其他构造函数也是如此,而不仅仅是String.

我用过的软件:

  • --harmony带有标志的节点 v5.11.0 。
  • 铬 50
  • 火狐 45

哪个 JavaScript 引擎是正确的,为什么?

4

1 回答 1

7

节点似乎是不正确的,es instanceof ExtendString肯定是true(就像每个人都期望的那样)。

String[Symbol.hasInstance]没有被覆盖,并且Object.getPrototypeOf(es)应该被覆盖,ExtendedString.prototype因为规范在String (value)函数描述中对此进行了详细说明:

  1. 返回StringCreate ( s, GetPrototypeFromConstructor (NewTarget, "%StringPrototype%"))。

newtarget指的是ExtendString当你构造new ExtendString('string')实例时,因为它是一个带有.prototype对象的构造函数,它ExtendedString.prototype不会%StringPrototype用作新创建的奇异 String 对象的 [[prototype]]:

  1. 将 [[Prototype]]内部插槽设置Sprototype
于 2016-04-26T20:53:38.023 回答