Проверка, является ли что-то классом в javascript

Теперь, когда у нас есть собственные реализации ES6, есть «настоящие классы». Это javascript-disabled в значительной степени синтаксический vanilla-js сахар для прототипного наследования, как javascript-disabled и в случае с функциями конструктора, но javascript-library есть тонкие различия, и они .js не являются полностью взаимозаменяемыми.

Пока vanillajs что единственный способ, который ecmascript я нашел, - это получить .toString() функции .js конструктора прототипа объекта vanillajs и проверить, начинается ли ecmascript он с class ИЛИ есть ли у объекта vanillajs конструктор и .toString() из который начинается javascript с class.

Обратите внимание, что ecmascript если ваш код скомпилирован javascript-disabled (например, большинство настроек javascript-disabled Babel или TypeScript), тогда javascript-execution он вернет function... вместо class... во время javascript выполнения (поскольку классы javascript-execution переносятся в функции конструктора).

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
}

Это js будет работать только в собственных javascript-execution средах (Chrome, Firefox, Edge, node.js javascript-execution и т. д.), в которых реализован javascript-disabled class для кода, который не был javascript-disabled перенесен в function.

Использование:

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

Если vanillajs есть способ получше, я хотел .js бы знать, что это такое.

javascript

2022-11-12T17:35:07+00:00