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

你能帮我解决这个JavaScript设计问题吗?,javascript,design-patterns,Javascript,Design Patterns,在制作对象时,我有如下代码: var myObject = { Init: function() { // config anything here to initiate this object. }; } 其中myObject.Init()的执行方式类似于类的构造函数。我使用此Init()以以下工厂模式概括要启动的对象: window[myObjectName].Init(); myObjectName是要创建的对象的任何名称 然后我还有第二个选择来创建一

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

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(以及在工厂中执行的所有其他对象)时,实际上减少了myObject代码

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

var myObject = function() {
    myObject.doSomething(); // instead of this.doSomething();
}
这与变量/对象引用有关(如果我错了,请纠正我)

这些选择的优点和缺点有什么帮助吗?在这两个选择中,您更喜欢哪一个?或者您能提出更好的解决方案吗


谢谢。

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

function MyObject() {
  this.x = 1;
  this.y = 2;
}
使用
new
关键字创建对象:

window[myObjectName] = new MyObject();
这样做的另一个优点是,您可以使用函数的原型向创建的对象添加方法:

MyObject.prototype = {

  doSomething: function() {
    // do something
  }

  doMore: function() {
    // do more
  }

};

在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.

早期,在我看来,您肯定能够使用
this.doSomething()
。那行代码的错误是什么?

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

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

window[myObjectName].Init.call(mynewthis);

在JavaScript中,调用者决定此
将引用什么。

它不起作用,因为他或她没有使用
new
将函数作为构造函数调用。抱歉nnnn,但我不确定您是否正确阅读了我的响应。我是说代码不应该导致错误:var myObject=function(){this.doSomething();}很难从原始帖子中分辨出来,因为代码不断地从
myObject
myObjectName
来回交换,但在我看来,Arly的意图是使用一个函数来创建对象,该函数使用
this
来引用新对象,除非使用
new
调用该函数,否则该函数将无法工作。否则,
这个
将引用一些东西,只是(可能)在那一点上没有什么用处。nnnnnn完全明白我的意思和解决方案。抱歉把你搞糊涂了,佩德罗德,我没想到会用新的。如果我这样做,是的,它将与你的回答一起工作。我试图使对象保持静态,但这仍然可以指它自己的,但是的,它不会工作,除非我使用新的。足够公平。我只是指出你可以用这个。在代码中,正如Guffa在答案中指出的,标记为正确。但是,是的,当实例化结构实例时,您必须使用new.Thank CWallenPole,您最后的代码注释回答了为什么在我的代码中这不起作用。