有`instanceof`的静态版本吗?

问题描述 投票:0回答:2

是否有

instanceof
的静态等效项?即,而不是:
obj1 instanceof Type
就像是:
TypeA instanceof TypeB

我找不到任何关于此事的信息,所以我把这个拼凑在一起:

function InstanceOf(type,parent) {
    do{ if(type === parent) return true;}
    while(type = Object.getPrototypeOf(type));
    return false;
}
//...
Instanceof(ChildClass, ParentClass); // = boolean

但我觉得有一种更好/更原生的方法来做到这一点,但同样,找不到任何东西。

是否有更好/标准的方法来检查静态类继承?或者我的 hack 是最好的吗?

javascript node.js instanceof prototypal-inheritance
2个回答
0
投票

您可以使用

isPrototypeOf

class A {}
class B extends A {}
class C extends B {}
const InstanceOf = (type, parent) => type === parent || parent.prototype.isPrototypeOf(type.prototype);
console.log(InstanceOf(B, A));
console.log(InstanceOf(A, A));
console.log(InstanceOf(C, A));
console.log(InstanceOf(C, B));
console.log(InstanceOf(B, C));


0
投票

在 JavaScript 中,instanceof 运算符用于检查对象是否是特定类或构造函数的实例。但是,为了检查两个构造函数(类结构)之间的继承关系,没有直接的内置等效函数。

使用自定义函数的解决方案是检查静态类继承的合理方法。但是,您还可以以更简单的方式使用 Object.getPrototypeOf 方法:

function isStaticInstanceOf(child, parent) {
    return child === parent || (!!child && isStaticInstanceOf(Object.getPrototypeOf(child), parent));
}

class Animal {}
class Dog extends Animal {}
class Rottweiler extends Dog {}


console.log(isStaticInstanceOf(Dog, Animal)); // true
console.log(isStaticInstanceOf(Dog, Dog)); // true
console.log(isStaticInstanceOf(Rottweiler, Animal)); // true
console.log(isStaticInstanceOf(Rottweiler, Dog)); // true
console.log(isStaticInstanceOf(Dog, Object)); // false
console.log(isStaticInstanceOf(Dog, Function)); // false

© www.soinside.com 2019 - 2024. All rights reserved.