ES6类扩展本机类型使得instanceof在某些JavaScript引擎中出现意外行为?

时间:2016-04-26 20:40:57

标签: javascript ecmascript-6 javascript-inheritance

考虑以下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。
  • Chrome 50
  • Firefox 45

哪个JavaScript引擎正确?为什么?

1 个答案:

答案 0 :(得分:7)

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

String[Symbol.hasInstance]未被覆盖,Object.getPrototypeOf(es)应为ExtendedString.prototype,因为规范详见String (value) function description

  
      
  1. 返回StringCreatesGetPrototypeFromConstructor(NewTarget,"%StringPrototype%"))。
  2.   

ExtendString在您构造new ExtendString('string')实例时引用.prototype,并且由于它是具有ExtendedString.prototype对象的构造函数,因此它将使用%StringPrototype而不是S prototype作为新创建的异域String对象的[[prototype]]:

  
      
  1. let visibleBool = view.superview?.subviews.last?.isEqual(view) //have to check first whether it's nil (bc it's an optional) //as well as the true/false if let visibleBool = visibleBool where visibleBool { value //can be seen on top } else { //maybe can be seen but not the topmost view } 的[[原型]] newtarget设为{{1}}。
  2.