在 Javascript 函数中,可以相当简单地检测该函数是否已简单执行或作为对象实例构造函数执行(使用new
关键词)。
// constructor
function SomeType() {
if (this instanceof SomeType)
// called as an object instance constructor
else
// the usual function call
}
没关系,这个问题已经在 SO 上至少回答过几次了。
因此,现在让我们假设我们的构造函数调用我直接在 Function 原型上定义的另一个函数,因此所有函数都可以访问它 - 这是我这样做的主要目的。
Function.prototype.doSomething = function doSomething() {
// what code here?
};
// constructor
function SomeType() {
SomeType.doSomething();
}
主要问题
我们现在如何检测内部doSomething
同样对于SomeType
功能?
我想检测它的原因是我正在编写一个函数adopts/injects构造函数参数与构造对象实例成员同名。当然,这个函数应该只在被构造函数调用时执行,而不是被定期调用的函数调用时执行。
这是我的答案 https://stackoverflow.com/a/27838697/75642到另一个问题,你可以在其中看到我的adoptArguments
将对象构造函数参数作为成员放入构造对象实例中的函数。
强制执行特定用法的解决方法=不好
我有一个可能不想使用的解决方法,因为它强制执行正确的用法 - 执行上下文注入。这是可以检测对象实例构造函数执行的代码:
Function.prototype.doSomething = function doSomething() {
if (this instanceof doSomething.caller)
{
// object instance construction
}
else return; // nope, just normal function call
};
// constructor
function SomeType() {
// required use of ".call" or ".apply"
SomeType.doSomething.call(this);
}
这个想法可能会激发你自己的一些想法来解决最初的问题