考虑以下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 ExtendString
是false
。它与其他构造函数相同,而不仅仅是String
。
我使用的软件:
--harmony
标志的节点v5.11.0。哪个JavaScript引擎正确?为什么?
答案 0 :(得分:7)
节点似乎不正确,es instanceof ExtendString
肯定应该是true
(就像所有人都期望的那样)。
String[Symbol.hasInstance]
未被覆盖,Object.getPrototypeOf(es)
应为ExtendedString.prototype
,因为规范详见String (value)
function description:
- 返回StringCreate(
醇>s
,GetPrototypeFromConstructor(NewTarget,"%StringPrototype%"
))。
ExtendString
在您构造new ExtendString('string')
实例时引用.prototype
,并且由于它是具有ExtendedString.prototype
对象的构造函数,因此它将使用%StringPrototype
而不是S
prototype
作为新创建的异域String对象的[[prototype]]:
- 将
醇>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}}。