Javascript 使用返回对象的对象构造函数。它是如何工作的?

Javascript 使用返回对象的对象构造函数。它是如何工作的?,javascript,oop,Javascript,Oop,我一直在创建这样的JS对象,比如a={}或者a=newmyconstructor(),但没有考虑太多 然后我想出了一些代码,如下所示: function Constructor(){ var private = { a:1, b:2 }; return private; } var a = new Constructor(); a现在自然包含private对象的新实例。然后我意识到new操作符不是必需的,因为每次调用Const

我一直在创建这样的JS对象,比如
a={}
或者
a=newmyconstructor()
,但没有考虑太多

然后我想出了一些代码,如下所示:

function Constructor(){
    var private = {
          a:1,
          b:2
    };
    return private;
}


var a = new Constructor();
a
现在自然包含
private
对象的新实例。然后我意识到
new
操作符不是必需的,因为每次调用
Constructor
函数时都会创建
private
对象

所以实际的问题是:调用
新构造函数()
时会发生什么

为什么不干脆做
a=Constructor()

构造函数
对象的任何公共属性(如果有)会发生什么变化

从构造函数返回对象是个坏主意吗

调用
新构造函数()
时会发生什么情况

看看这个问题

创建了一个实例(如
Object.create(Constructor.prototype)
),可以通过
构造函数内的
this
访问该实例。但是,调用的结果将只返回分配给
a
的对象(
private

为什么不干脆做
a=Constructor()

事实上,你应该这样做<代码>构造函数
不是构造函数,它不创建实例-它只返回
私有
对象。因此,不要使用
new
。但是,还应重命名该函数,使其清晰可见,例如,将其重命名为
makeXYZ()

如果 有吗

a
b
是返回对象的“公共”属性。
如果您指的是
构造函数
函数本身的“静态”属性,则它们不会发生任何变化。
如果您指的是
构造函数.prototype
上的“共享”属性,则它们不会被返回的对象继承(这可能不是预期的)

从构造函数返回对象是个坏主意吗

来自构造函数,是的。
从一般的函数来看,不是。将其设置为普通模式(即返回对象的函数),这是一个很好的模式。

您面临的是“NativeObject”javascript模式。 它模拟了一些OOP范例,如封装、多态、继承、抽象等

使用“new”关键字创建对象的新实例,在JS中可以

var function_example = function() {
var privateField = 11;
var publicField = 22;

return {
publicField: publicField
}    
}
因此,当您需要获取对象时,可以调用此函数:

var object = function_example();
如果要将函数作为委托获取并为其分配引用,可以:

var function2_axample = function_example;
如果要创建新实例,您应该:

var instance = new function_example();
var publicValue = instance.publicField;

所以,你可以记住,与OOP范例相比,它是这样的:函数——它是类,新函数——它是实例

可能会有帮助。同样相关的是(你实际上是在谈论工厂函数,而不是构造函数)。因此,这个问题的实际答案是(根据文档)
当构造函数返回一个值时,对象构造过程被覆盖。对吗?有点对。实例对象仍然被创建,并且可以像往常一样在构造函数中作为
this
访问,但是
a
将成为仅返回的
private
对象。这就是答案:)如果您在答案中添加此项,我将接受它