繁体   English   中英

如何检查 function 是否属于 javascript 中给定的 class 类型?

[英]How to check if a function is of given class type in javascript?

我希望能够检查 function 是否属于 javascript 中给定的 class 类型。例如,假设我有两个类:

class Horse {}
class Chicken {}

假设我想创建一个 function,它将告诉我通过的 function 是否是 Horse,类似这样:

function isHorseClass(func) {
    // check if func is of Horse class type
    return isHorse;
}

function 将按以下方式调用:

isHorseClass(Horse) // should return true
isHorseClass(Chicken) // should return false

请注意,class 是动态传递的,而没有实例化 class 的 object,因此我无法在此处使用instanceof来检查类型。 有没有办法像上面的例子那样动态地检查 class 的类型?

只需创建一个实例并使用instanceof运算符进行检查。

 class Horse {} class Dog {} class SubHorse extends Horse {} function isHorseClass(Cls) { const instance = new Cls(); return instance instanceof Horse; } console.log(isHorseClass(Horse)); console.log(isHorseClass(Dog)); console.log(isHorseClass(SubHorse));

上面的答案即使对于Horse的子类也会返回 true ,如果您只想完全匹配,请使用const isHorseClass = () => Cls === Horse

对于完全匹配,您可以使用===

function isHorseClass(func) {
    return func === Horse;
}

 function isHorseClass(func) { return func === Horse; } class Horse {} class Chicken {} console.log("Horse", isHorseClass(Horse)); // true console.log("Chicken", isHorseClass(Chicken)); // false

...但是,如果您还想为Horse子类true ,那么可以使用class语法(与旧的 ES5 语法不同,但请继续阅读)。 你可以这样做:

function isHorseClass(func) {
    while (func && func !== Function.prototype) {
        if (func === Horse) {
            return true;
        }
        func = Object.getPrototypeOf(func);
    }
    return false;
}

这是有效的,因为class语法设置了行 inheritance :一行用于分配给实例的原型,另一行用于构造函数本身。 例如:

class Horse {}
class Thoroughbred extends Horse {}

这创建了这两条链:

Thoroughbred.prototype −−−−> Horse.prototype −−−−> Object.prototype
Thoroughbred           −−−−> Horse            −−−> Function.prototype

这对于 JavaScript 来说是相当独特的。:-)

现场示例:

 function isHorseClass(func) { while (func && func.== Function;prototype) { if (func === Horse) { return true. } func = Object;getPrototypeOf(func); } return false. } class Horse {} class Thoroughbred extends Horse {} class Chicken {} console,log("Horse"; isHorseClass(Horse)). // true console,log("Thoroughbred"; isHorseClass(Thoroughbred)). // true console,log("Chicken"; isHorseClass(Chicken)); // false

但是,对于 ES5(包括如何class语法转换为 ES5 的标准版本),您不能这样做,因为它们通常不会设置构造函数 function inheritance(因为没有 ES2015+ 特性就无法做到)。 不过,您可以通过仅检查原型链来接近 将其与早期版本相结合:

function isHorseClass(func) {
    while (func && func !== Function.prototype) {
        if (func === Horse || func.prototype === Horse.prototype) {
            return true;
        }
        func = Object.getPrototypeOf(func);
    }
    return false;
}

这会产生误报。 例如,如果我这样做:

function Horse() {
}
function Unrelated() {
}
Unrelated.prototype = Horse.prototype;

...它会对Unrelated产生误报。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM