現在,我們有ES6的本機實現,還有 「真正的類」。與構造函數一樣,這些主要是用於原型繼承的語法糖,但是存在細微的差異,並且兩者不完全可以互換。
到目前爲止,我發現的唯一方法是獲取對象的原型的構造函數的.toString()
並檢查它是否與class
開始,或者如果對象有一個構造函數和是開始的.toString()
與class
。請注意,如果您的代碼已編譯(即:大多數Babel或TypeScript設置),那麼這將在運行時返回function...
而不是class...
(因爲類被轉換爲構造函數)。
function isClass(obj) {
const isCtorClass = obj.constructor
&& obj.constructor.toString().substring(0, 5) === 'class'
if(obj.prototype === undefined) {
return isCtorClass
}
const isPrototypeCtorClass = obj.prototype.constructor
&& obj.prototype.constructor.toString
&& obj.prototype.constructor.toString().substring(0, 5) === 'class'
return isCtorClass || isPrototypeCtorClass
}
這將僅在本地環境中已經實施class
對於尚未transpiled到function
碼器(Chrome,火狐,邊緣,Node.js的,等等)的工作。
用法:
class A {}
class B extends A {}
isClass(A) // true
isClass(new A()) // true
isClass(B) // true
isClass(new B()) // true
function C() {}
isClass(C) // false
isClass(new C()) // false
isClass({}) // false
isClass(Date) // false
isClass(new Date()) // false
//These cases return 'true' but I'm not sure it's desired
isClass(Object.create(A)) // true
const x = {}
Object.setPrototypeOf(x, A)
isClass(x) // true
如果有更好的辦法,我很想知道它是什麼。
您是否正在使用在JavaScript中實現經典繼承的庫? – Nosredna 2009-02-08 23:40:30
不,我只是使用普通的javascript:d – kgrad 2009-02-09 02:50:52