JavaScript中类似函数的类

时间:2014-08-13 13:04:29

标签: javascript ecmascript-5

是否可以使用new new A在JS中执行A !== Function?那么A的理想结构是什么?

2 个答案:

答案 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对象的特殊内部(不可访问)属性。