Используя синтаксис ES6 class
, мне интересно, почему оператор instanceof
не работает для цепочки наследования, когда существует более одной цепочки наследования?
(optional read)Как работает оператор
instanceof
?В
obj instanceof Constructor
операторinstanceof
проверяет, присутствует ли свойство'prototype'
функцииConstructor
в цепочке prototype функцииobj
. Если он присутствует, вернутьtrue
. В противном случаеfalse
.
В следующем фрагменте BTError
наследуется от Error
(1.), а SomeError
расширяется от BTError
(3.). ).
Но, как видно из (4.), оператор instanceof
возвращает false
вместо new SomeError() instanceof BTError
, что, по моему мнению, должно быть true
.
class BTError extends Error {}
console.log('1.', Reflect.getPrototypeOf(BTError.prototype) === Error.prototype); // 1. true
console.log('2.', new BTError() instanceof Error); // 2. true
console.log('');
class SomeError extends BTError {}
console.log('3.', Reflect.getPrototypeOf(SomeError.prototype) === BTError.prototype); // 3. true
console.log('4.', new SomeError() instanceof BTError); // 4. false
console.log('');
class SpecificError extends SomeError {}
console.log('5.', Reflect.getPrototypeOf(SpecificError.prototype) === SomeError.prototype); // 5. true
console.log('6.', new SpecificError() instanceof Error); // 6. true
console.log('7.', new SpecificError() instanceof BTError); // 7. false
console.log('8.', new SpecificError() instanceof SomeError); // 8. false
Вопрос
Есть ли что-то нетривиальное, что я не могу понять, или оператор instanceof
просто ведет себя странно?
true
в FF, Edge и Chrome - person Thomas   schedule 06.02.2017true
. Похоже транспиляция лажает... - person alebianco   schedule 06.02.2017