是否可以使用new new A
在JS中执行A !== Function
?那么A的理想结构是什么?
答案 0 :(得分:4)
是的,理论上。
function A() {
return function B() {
}
}
> new new A
B {}
或
> new new A()
> new new A() ()
因为括号是new
运算符的可选项。
这利用了构造函数可以返回除构造对象之外的其他东西的事实。非常不清楚为什么有人会想要这样做。此外,这不会改变new
只能在函数上调用的事实。
此
function A() { return A; }
允许你这样做
new new new new new new new new new new new new A
没有任何意义。
您知道在构造函数上调用new
会使用该构造函数的原型构造一个对象。但是,如果从构造函数返回this
以外的任何对象,this
及其相关原型将永远丢失给全世界。无论你返回什么对象都有自己的原型,来自任何地方 - 而不是A的。这同样适用于构造函数返回函数的情况,在这种情况下相关的原型是Function.prototype
。有没有办法安排它,在我们关心的不太可能的事件中,以便new A
继续返回一个功能函数,我们可以new
开启A.prototype
,同时还可以访问{{1} }}?
不容易。如果您想要从function B
返回new A
的其他属性,那么您可以在返回function B
之前添加这些属性。
答案 1 :(得分:0)
不,这是不可能的。 A
必须是一个函数,无论其返回值如何。
来源:ECMAScript 5 spec for the new
operator:
如果构造函数没有实现[[Construct]]内部方法, 抛出TypeError异常。
从Function specification,我们可以看到[[Construct]]
是Function对象的特殊内部(不可访问)属性。