JavaScript中类似函数的类

JavaScript中类似函数的类,javascript,ecmascript-5,Javascript,Ecmascript 5,有没有可能在JS中使用!==作用那么A的理想结构是什么?不,不可能。A必须是函数,无论其返回值如何 资料来源: 如果构造函数没有实现[[Construct]]内部方法, 抛出TypeError异常 从中,我们可以看到[[Construct]]是函数对象的一个特殊的内部不可访问属性。是的,理论上 function A() { return function B() { } } > new new A B {} 或 因为括号对于新运算符是可选的 这利用了一个事实,即构造函数可

有没有可能在JS中使用!==作用那么A的理想结构是什么?

不,不可能。A必须是函数,无论其返回值如何

资料来源:

如果构造函数没有实现[[Construct]]内部方法, 抛出TypeError异常

从中,我们可以看到[[Construct]]是函数对象的一个特殊的内部不可访问属性。

是的,理论上

function A() { 
  return function B() {
  } 
}
> new new A
  B {}

因为括号对于新运算符是可选的

这利用了一个事实,即构造函数可以返回构造对象以外的内容。现在还不清楚为什么会有人想这么做。此外,这并没有改变new只能在函数上调用的事实

好奇系 这个

允许您这样做

new new new new new new new new new new new new A
这样做毫无意义

原型链 您知道,对构造函数调用new会构造一个具有该构造函数原型的对象。但是,如果您从构造函数返回除此之外的任何对象,则此对象及其关联的原型将永远丢失给世界。您返回的任何对象都有其自己的原型,来自任何不是A的对象。这同样适用于构造函数返回函数的情况,在这种情况下,相关的原型是function.prototype。在我们关心的不太可能的事件中,是否有任何方法来安排它,以便新的A继续返回一个功能,我们可以在新的基础上进行新的操作,同时也可以访问A.prototype


不容易。如果您想要从新A返回的函数B的附加属性,那么您可以在返回函数B之前添加这些属性。

您是指新A吗?我知道新关键字是什么,可能是重复的。谢谢。这只是一个好奇,但是:规范并不禁止非函数主机对象实现内部[[Construct]]属性,尽管我不知道有任何实际的主机环境提供非函数构造函数。a应该是函数还是新的a应该是函数?为什么不可能调整类型的构造函数,使构造的对象具有内部[[Construct]]?@polkovnikov.ph不可能直接从JS代码更改对象的内部属性,这也是它们被称为内部的部分原因。回答第一个问题:A必须是函数,新A的结果也必须是函数。A和新A都必须是函数,或者,正如apsillers指出的,运行时赋予[[Construct]]属性的特殊对象可能不存在。[[Construct]]完全在主机运行时的领域中;已执行的JavaScript代码无法触及它。@joews注意,该问题指定了一个!==函数不是A的类型!=函数,也就是说,A可以是一个函数,只是不是特定的函数构造函数函数,所以根据torazaburo的回答,这在技术上是可能的。太棒了!这是我一直期待的答案。这是一种符合标准的行为吗?@polkovnikov.ph是的,这是完全有效的ECMAScript行为,根据:让结果成为调用[[Call]]内部属性的结果。。。如果Typeresult是对象,则返回结果。i、 例如,如果调用函数时的行为返回一个对象,则使用该对象作为构造新调用的返回值。函数是对象,因此它是构造函数的有效返回值。@torazaburo你不知道如何在那里还原原型链吗?@polkovinkov.ph a是一个构造构造函数的函数,我们将其称为构造构造函数B。当你构造B的实例时,实例使用B的原型链。简单地围绕B而不是A构建原型链-A是一个构造函数,它生成构造函数,而不是正确的对象。如果由于某种原因使用B.prototype不实用,您还没有说为什么您需要支持新的A,您也可以让B返回使用object.createA.prototype创建的对象。@apsillers我忘记了我自己到底为什么需要它,但后来记得我想var User=new Model…,User=new User。。。;。
function A() { return A; }
new new new new new new new new new new new new A