Maintenant que nous avons mises en œuvre natifs de ES6, il y a des "classes réelles". Ce sont en grande partie du sucre syntaxique pour l'héritage prototypique comme pour les fonctions du constructeur, mais il existe des différences subtiles et les deux ne sont pas complètement interchangeables.
la seule façon que je l'ai trouvé à ce jour, est d'obtenir la .toString()
de la fonction constructeur de prototype de l'objet et vérifier si elle commence par class
ou si l'objet a un constructeur et la .toString()
de que commence par class
. Notez que si votre code est compilé (c.-à-d. La plupart des configurations Babel ou TypeScript), alors cela retournera function...
au lieu de class...
lors de l'exécution (puisque les classes sont transférées aux fonctions constructeurs).
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
}
Cela ne fonctionnera que dans les environnements natifs (Chrome, Firefox, Edge, Node.js, etc.) qui ont mis en œuvre class
pour le code qui n'a pas été transpiled à function
.
Utilisation:
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
S'il y a une meilleure façon, j'aimerais savoir ce qu'il est.
Utilisez-vous une bibliothèque qui implémente l'héritage classique en JavaScript? – Nosredna
Non, je suis simplement en utilisant javascript: – kgrad