我希望能夠檢查函式是否屬于 javascript 中的給定型別別。例如,假設我有兩個類:
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
請注意,類是動態傳遞的,沒有實體化類的物件,所以我不能instanceof在這里檢查型別。有沒有辦法像上面的例子一樣動態檢查類的型別?
uj5u.com熱心網友回復:
對于完全匹配,您可以使用===:
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
...但是如果您還想獲得truefor Horse subclasses,那么可以通過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 純種 ????> 馬 ???> 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 的標準版本),您不能這樣做,因為它們通常不會設定建構式繼承(因為您不能沒有 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。
uj5u.com熱心網友回復:
只需創建一個實體并使用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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/463374.html
標籤:javascript 打字稿 原型链
上一篇:使用localeCompare對物件陣列進行排序,值可能為false
下一篇:將引數傳遞給路由
