我今天发现了一件非常奇怪的事情:如果您使用构造函数和新关键字创建对象,但从构造函数返回函数,它的行为如下:
>新创建的“对象”是一个函数.
>那个新功能可以像普通的一样被调用,但是…
>如果在构造函数中维护对此的引用,则引用从构造函数正确创建的对象.这是你期望从新的回报.
以下是一个例子:
function Constructor() { var self = this; this.name = 'instance'; return function() { return self; } }
所以如果你这样实例化:var instance = new Constructor()
将产生以下结果:
typeof instance //returns "function" typeof instance() //returns "object" instance() //returns { name: 'instance' }
所以我想我有三个问题:
>这是合法的,它是否可以跨浏览器工作?这真的很棒,我认为它可以在很多方面使用,但这种行为是否可靠?
>后台会发生什么导致这种行为?
>(可能由2回答,但…)新实例中的新对象(引用“this”),因为它都是独立的,被垃圾回收器正确清理
解决方法
>是的,而默认情况下构造函数返回正在构造的新对象(由此引用),只要返回一个对象,就可以覆盖该返回值.因为一个函数是一个对象,你可以按照你的例子返回它.新创建的对象本身不是一个函数,但是返回的函数会引用新变量范围内的新对象.
>见#1
>这是因为一个函数创建一个闭包,所以它继续引用自变量,这恰好引用正在构造的实际对象.所以我不会说这是“内部”的任何东西,而只是功能的可变范围的一部分.
>见#1
>这是因为一个函数创建一个闭包,所以它继续引用自变量,这恰好引用正在构造的实际对象.所以我不会说这是“内部”的任何东西,而只是功能的可变范围的一部分.
要明白的是,您的功能与任何其他功能没有任何区别.就像你已经返回一个Array一样,你只需要一个常量的Array,它可以引用新的对象.
function Constructor() { this.name = 'instance'; return [ this ]; // Instead return an Array that references the new object }