javascript – 使用’new’创建对象时使用’return’

前端之家收集整理的这篇文章主要介绍了javascript – 使用’new’创建对象时使用’return’前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我今天发现了一件非常奇怪的事情:如果您使用构造函数和新关键字创建对象,但从构造函数返回函数,它的行为如下:

>新创建的“对象”是一个函数.
>那个新功能可以像普通的一样被调用,但是…
>如果在构造函数中维护对此的引用,则引用从构造函数正确创建的对象.这是你期望从新的回报.

以下是一个例子:

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
>这是因为一个函数创建一个闭包,所以它继续引用自变量,这恰好引用正在构造的实际对象.所以我不会说这是“内部”的任何东西,而只是功能的可变范围的一部分.

要明白的是,您的功能与任何其他功能没有任何区别.就像你已经返回一个Array一样,你只需要一个常量的Array,它可以引用新的对象.

function Constructor() {

  this.name = 'instance';
  return [ this ];  // Instead return an Array that references the new object
}

猜你在找的JavaScript相关文章