【发布时间】:2015-03-06 11:17:21
【问题描述】:
在 Javascript 函数中,它是一个相当简单的检测函数是简单地执行还是作为对象实例构造函数执行(使用 new 关键字)。
// constructor
function SomeType() {
if (this instanceof SomeType)
// called as an object instance constructor
else
// the usual function call
}
没关系,这个问题已经在这里回答过至少几次了。
现在假设我们的构造函数调用了我直接在 Function 原型上定义的另一个函数,因此所有函数都可以访问 - 我这样做的主要目的。
Function.prototype.doSomething = function doSomething() {
// what code here?
};
// constructor
function SomeType() {
SomeType.doSomething();
}
主要问题
我们现在如何在doSomething 中检测到与SomeType 函数相同的情况?
我想检测它的原因是我正在编写一个函数,该函数采用/注入构造函数参数作为具有相同名称的构造对象实例成员。当然,这个函数应该只在被构造函数调用而不是被定期调用的函数调用时执行。
This is my answer 到另一个问题,您可以在其中看到我的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);
}
这个想法可能会激发你自己的一些想法来解决最初的问题
【问题讨论】:
-
hmmm - 如果变通方法需要特定的调用,您还需要强制进行构造检查(而不是调用或应用样式调用)?
-
@Woody:好吧,如果所有子功能都会做这个检查,那就是真的。但不是。在我的实际场景中,这个
doSomething函数可以做其他事情,并且可以在 this answer I've written 中看到另一个 SO 问题。 -
所以也许理解为什么你需要知道这两种情况的区别,会导致解决方案。目前还不清楚动机是什么。
-
@MichaelPerrenoud:好的。我编辑了我的主要问题部分来解释我为什么要检测这个...
-
“当然,这个函数应该只在被构造函数调用而不是被定期调用的函数调用时执行。”。您的意思是检测在 any 类型实例的上下文中调用
doSomething的任何位置,而不仅仅是SomeType?
标签: javascript oop prototype