Я пытаюсь реализовать какую-то иерархию классов в JavaScript. я
Кажется, я понял цепочку прототипов, но мне все еще нужно разобраться
конструктор-цепочка. Следуя Полному руководству Дэвида Фланагана ,
Я написал
function DerivedClass()
{
BaseClass.apply(this, arguments); // chain constructors
// do some initializations specific to DerivedClass...
}
var foo = new DerivedClass();
, где BaseClass()
- моя собственная функция, написанная на C ++ (я
используя QtScript ). Моя проблема в том, что тогда, BaseClass()
называется
как функция, а не как конструктор.
Я мог бы написать BaseClass()
, чтобы он всегда вел себя как конструктор, однако это
называется. Но я боюсь, что однажды один из моих пользователей забудет new
и просто напиши
var bar = BaseClass();
В такой ситуации я бы хотел BaseClass()
сделать что-то еще
разумнее, чем инициализировать глобальный объект. Например:
if (!context->isCalledAsConstructor()) fail_gracefully();
Но тогда цепочка конструктора терпит неудачу!
Есть ли способ, которым я могу связать конструкторы и получить BaseClass()
на самом деле называться конструктором? Или я должен просто обучить своих пользователей
никогда не забывать new
? Прямо сейчас я испытываю желание заменить тест выше
по:
if (context->thisObject().strictlyEquals(engine->globalObject()))
fail_gracefully();
но мне интересно, есть ли более чистый способ справиться с этим.
Спасибо!