Javascript 使用返回对象的对象构造函数。它是如何工作的?
我一直在创建这样的JS对象,比如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
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
对象。这就是答案:)如果您在答案中添加此项,我将接受它