我试图在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();
,但我不知道是否有处理这种更清洁的方式。
谢谢!
嗯,从技术上讲,我可以通过抛出一个异常来保护它们,或者忽略'this'并返回一个全新的对象(比如'Array()')。我的问题是,第一个选项干扰构造函数链,而第二个选项与原型链不兼容。 – 2010-10-21 12:54:40