如何检查函数是否属于 javascript 中给定的 class 类型?
How to check if a function is of given class type in javascript?
我希望能够检查函数是否属于 javascript 中给定的 class 类型。
例如,假设我有两个 classes:
class Horse {}
class Chicken {}
假设我想创建一个函数来告诉我传递的函数是否是 Horse,类似这样的函数:
function isHorseClass(func) {
// check if func is of Horse class type
return isHorse;
}
该函数将按以下方式调用:
isHorseClass(Horse) // should return true
isHorseClass(Chicken) // should return false
注意class是动态传递的,没有实例化class的对象,所以我不能用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));
以上答案 returns 即使对于 Horse
的子类也是正确的,如果您只想完全匹配,请使用 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
语法设置了 两个 继承线:一个用于分配给实例的原型,另一个用于构造函数本身。例如:
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 的标准版本),你不能这样做,因为它们通常不设置构造函数继承(因为你不能' t 没有 ES2015+ 特性)。不过,您可以通过仅检查原型链来获得 close。将其与早期版本相结合:
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
产生误报。
我希望能够检查函数是否属于 javascript 中给定的 class 类型。 例如,假设我有两个 classes:
class Horse {}
class Chicken {}
假设我想创建一个函数来告诉我传递的函数是否是 Horse,类似这样的函数:
function isHorseClass(func) {
// check if func is of Horse class type
return isHorse;
}
该函数将按以下方式调用:
isHorseClass(Horse) // should return true
isHorseClass(Chicken) // should return false
注意class是动态传递的,没有实例化class的对象,所以我不能用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));
以上答案 returns 即使对于 Horse
的子类也是正确的,如果您只想完全匹配,请使用 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
语法设置了 两个 继承线:一个用于分配给实例的原型,另一个用于构造函数本身。例如:
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 的标准版本),你不能这样做,因为它们通常不设置构造函数继承(因为你不能' t 没有 ES2015+ 特性)。不过,您可以通过仅检查原型链来获得 close。将其与早期版本相结合:
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
产生误报。