当前位置: 首页 > 面试题库 >

如何检测一个函数是否被称为构造函数?

张锐藻
2023-03-14
问题内容

给定一个功能:

function x(arg) { return 30; }

您可以用两种方式来称呼它:

result = x(4);
result = new x(4);

第一个返回30,第二个返回一个对象。

您如何检测 在函数本身内部 调用 该函数的方式

无论您采用哪种解决方案,它都必须与以下调用一起使用:

var Z = new x(); 
Z.lolol = x; 
Z.lolol();

当前所有解决方案都认为将该Z.lolol()方法称为构造函数。


问题答案:

我认为[ES2015之前]您想要的东西是不可能的。函数内根本没有足够的信息来进行可靠的推断。

查看ECMAScript 3rd Edition规范,new x()调用时所采取的步骤实质上是:

  • 创建一个新对象
  • 将其内部的[[Prototype]]属性分配给的prototype属性 x
  • x正常调用,将新对象传递给this
  • 如果调用x返回了对象,则返回它,否则返回新对象

对于执行该代码而言,没有什么有用的关于函数调用的方法,因此,唯一可以在内部进行测试的x就是this值,这就是所有答案的作用。正如您所观察到的,的新实例x时调用x的构造函数是从预先存在的实例不可区分的x方式是:传递this时调用x一个函数,

除非* 你指定一个属性被创建的每个新的对象x,因为它构造:

function x(y) {
    var isConstructor = false;
    if (this instanceof x // <- You could use arguments.callee instead of x here,
                          // except in in EcmaScript 5 strict mode.
            && !this.__previouslyConstructedByX) {
        isConstructor = true;
        this.__previouslyConstructedByX = true;
    }
    alert(isConstructor);
}

显然,这并不理想,因为您现在x可以覆盖每个由此构造的对象的多余的属性,但是我认为这是您可以做的最好的事情。

(*) “ instance of”是一个不准确的术语,但足够接近,并且比“ x作为构造函数调用而创建的对象”更为简洁



 类似资料:
  • 问题内容: 我有一个变量,我想知道它是否指向一个函数。 我曾希望我可以做些类似的事情: 但这给了我: 我选择的原因是 问题答案: 如果这是用于Python 2.x或Python 3.2+,则也可以使用。它曾经不推荐使用,但是现在不推荐使用,因此你可以再次使用它。你可以在此处阅读讨论内容:http : //bugs.python.org/issue10518。你可以执行以下操作: 如果这是针对Pyt

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 问题内容: 我在一个Activity中有一个IntentService,当我尝试调用该服务时,它将引发此错误,我发现这很奇怪,因为如果我声明了空的构造函数。 错误: AndroidManifest.xml 活动: 问题答案: 你是一个内部阶级。如果要将其保留在内部,请将其更改为static: 您可能需要阅读不同类型的嵌套类。google的第一个链接:http : //docs.oracle.com

  • 我正在测试路由器,有两个函数,我需要测试第一个函数是否被调用,第二个函数是否被调用。有方法

  • 我目前在我的大学学习初级java课程,仍然在学习编程的基础知识。这周我们一直在学习构造函数,我被困在本周任务的后半部分,所以任何帮助都将不胜感激。 实验室的第二部分(我一直坚持的部分)的说明如下: 为类Truck编写完整的代码,如下面的类图所示。一定不要在构造函数中使用重复的代码。例如,具有2个参数的构造函数应该调用具有1个参数的构造函数来设置柱体的值。 这些是它想让我做的构造函数。 任何关于如何

  • 可能重复:< br >什么是复制省略和返回值优化? 我很难理解为什么在下面的代码中没有调用复制构造函数。 有人能解释一下为什么只调用构造函数,不调用复制构造函数吗?< br >谢谢。