Подтвердить что ты не робот

CoffeeScript: использование instanceof vs Class.constructor.name

Если у меня есть класс:

class Haha
  constructor: (@lolAmount = 1) ->
    alert @lolAmount

И я хочу проверить, имеет ли объект правильный класс. Всегда ли безопасно использовать constructor.name:

haha = new Haha()
unless haha.constructor.name is 'Haha'
  throw Error 'Wrong type'

или лучше использовать instanceof:

haha = new Haha()
unless haha instanceof Haha
  throw Error 'Wrong type'

Один аргумент, который у меня есть для instanceof, используется при использовании extends:

class BigHaha extends Haha

bigHaha = new BigHaha
console.log bigHaha instanceof Haha #true

но насколько это безопасно, будучи оператором JavaScript - я чувствую, что я должен скептически относиться к этому.

С другой стороны, при constructor.name очень ясно, что происходит. Гарантировано ли, что constructor.name будет установлено для всех объектов?

Спасибо за любую информацию.

4b9b3361

Ответ 1

Прежде всего, constructor также является прямым JavaScript:

Возвращает ссылку на функцию Object, которая создала прототип экземпляра.

Итак, когда вы говорите o.constructor, вы действительно делаете прямой JavaScript, имя constructor для функции инициализации объекта CoffeeScript - это отдельный вопрос.

Итак, теперь у вас есть выбор между использованием свойства JavaScript constructor или JavaScript instanceof. constructor просто сообщает вам, что "класс" использовался для создания объекта, instanceof с другой стороны:

[...] проверяет, имеет ли объект в своей цепочке прототипов свойство prototype конструктора.

Итак instanceof - правильный выбор, если вы хотите разрешить подклассу.