我认为[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作为构造函数调用而创建的对象”更为简洁



