使用返回对象的Object构造函数。这个怎么运作?

时间:2014-06-20 10:06:10

标签: javascript oop

我一直在创建像这个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对象的任何公共属性会发生什么变化?

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

2 个答案:

答案 0 :(得分:0)

  

致电new Constructor()时会发生什么?

查看the docs for the new operatorWhat is the 'new' keyword in JavaScript?问题。

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

  

为什么不应该只做a = Constructor()

实际上,你应该这样做。 Constructor不是构造函数,它不会创建实例 - 它只返回private对象。因此,请勿使用new。但是,您还应该重命名该功能以使其清晰,例如到makeXYZ()

  

如果Constructor对象的任何公共属性会发生什么   任何?

ab是" 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范例相比,它是这样的:函数 - 它是类,新函数 - 它是实例。