我一直在创建像这个a = {}
或者a = new MyConstructor()
这样的JS对象,而不用多考虑它。
然后我想出了一些看起来像这样的代码:
function Constructor(){
var private = {
a:1,
b:2
};
return private;
}
var a = new Constructor();
a
naturaly现在包含private
对象的新实例。然后我意识到new
运算符不是必需的,因为每次调用private
函数时都会创建Constructor
对象。
所以实际的问题是:调用new Constructor()
时会发生什么?
为什么不应该只改为a = Constructor()
?
Constructor
对象的任何公共属性会发生什么变化?
从构造函数返回对象是个坏主意吗?
答案 0 :(得分:0)
致电
new Constructor()
时会发生什么?
查看the docs for the new
operator和What is the 'new' keyword in JavaScript?问题。
创建了一个实例(如Object.create(Constructor.prototype)
),可以通过this
函数中的Constructor
访问该实例。但是,调用的结果只是返回的对象(private
),该对象已分配给a
。
为什么不应该只做
a = Constructor()
?
实际上,你应该这样做。 Constructor
不是构造函数,它不会创建实例 - 它只返回private
对象。因此,请勿使用new
。但是,您还应该重命名该功能以使其清晰,例如到makeXYZ()
。
如果
Constructor
对象的任何公共属性会发生什么 任何?
a
和b
是" public"返回对象的属性
如果你的意思是"静态" Constructor
函数本身的属性,没有任何反应
如果你的意思是"分享" Constructor.prototype
上的属性 - 它们没有任何反应,它们不会被返回的对象继承(这可能不是预期的那样)。
从构造函数返回对象是个坏主意吗?
从建设者那里,是的 从一般的功能,没有。使它成为正常factory function(即返回对象的函数),这是一个很好的模式。
答案 1 :(得分:0)
你面对" 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范例相比,它是这样的:函数 - 它是类,新函数 - 它是实例。