你能帮我解决这个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,您最后的代码注释回答了为什么在我的代码中这不起作用。