你能帮我决定这个JavaScript设计问题吗?

时间:2011-08-24 07:04:37

标签: javascript design-patterns

我在制作对象时有以下代码:

var myObject = {
    Init: function() {
        // config anything here to initiate this object.
    };
}

myObject.Init()的执行方式类似于类的构造函数。我使用这个Init()来概括要在以下工厂模式中启动的对象:

window[myObjectName].Init();

myObjectName是要创建的对象的任何名称。

然后我又有了第二个选择来创建一个对象,这对我来说实际上更容易将Init()变成某种构造函数,如下面的代码:

var myObject = function() {
    // config anything here to initiate this object.
}

使用上面的代码,我可以简单地创建一个如下对象:

window[myObjectName]();

实际上减少了附加了Init()的myObject代码(以及我在工厂里做的每一个其他对象)。

然而第二个选择带来了一个我发现的缺点,我不能在对象中使用this,我实际上必须明确地使用myObject来调用内部的东西。例如:

var myObject = function() {
    myObject.doSomething(); // instead of this.doSomething();
}

我对变量/对象引用有点担心(如果我错了,请纠正我。)

对这些选择的优缺点有何帮助?您更喜欢这两种选择,还是可以建议更好的解决方案?

感谢。

4 个答案:

答案 0 :(得分:3)

为什么不使用构造函数?您建议的两种方法都需要在初始化对象之前创建和存储对象。你可以这样做:

function MyObject() {
  this.x = 1;
  this.y = 2;
}

使用new关键字创建对象:

window[myObjectName] = new MyObject();

这样做的另一个好处是你可以使用函数的原型来为创建的对象添加方法:

MyObject.prototype = {

  doSomething: function() {
    // do something
  }

  doMore: function() {
    // do more
  }

};

答案 1 :(得分:1)

在js中创建类结构有几种不同的方法。我个人的偏好,虽然是你的第二个例子。

var MyClass = function() {
    // define local variables
    var x = 0;
    function doSomething()
    {
       return ++x;
    }
    function doSomethingTwice()
    { 
        doSomething(); 
        doSomething(); 
    }

    // basically an export section where variables are assigned "public names"
    this.doSomething = doSomething;
    this.doSomethingTwice = doSomethingTwice;
    // careful though, this next line WON'T WORK!
    this.x = x; // because this is an assignment by value, this.x will be 0 
                // no matter how many times you `doSomething`
};
var inst = new MyClass(); // the `new` keyword is imperative here
                          // otherwise `this` won't work right.

答案 2 :(得分:0)

Arly,在我的理解中,你绝对应该能够使用this.doSomething()。你在那行代码中得到的错误是什么?

答案 3 :(得分:0)

第二种方式实际上是首选方式。 JavaScript中的this并不总是引用当前对象。您通常会在对象周围保留一个参考,这样您就不必依赖this

即使您使用.Init函数编写代码,我作为调用者也可以通过执行

来覆盖您的代码
window[myObjectName].Init.call(mynewthis);

在JavaScript中,来电者决定this将引用的内容。