Я пытаюсь реализовать некоторую иерархию классов в JavaScript. I думаю, что я понял цепочку прототипов, но мне все же приходится разбираться в цепочке конструкторов . После Дэвид Фланегана, Definitive Guide, я написалЦепочки-конструкторы в 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();
, но мне интересно, если есть более чистый способ справиться с этим.
Спасибо!
Ну, технически я могу защитить их, либо выбросив исключение, либо проигнорировав «это» и вернув совершенно новый объект (например, «Массив()»). Моя проблема в том, что первый вариант мешает цепочке конструкторов, в то время как вторая не играет хорошенько с цепочкой прототипов. –