Reputation:
I have a code as follow in making an object:
var myObject = {
Init: function() {
// config anything here to initiate this object.
};
}
Where myObject.Init() performs like a constructor of a class. I use this Init() to generalize the object to be initiated in a following factory pattern:
window[myObjectName].Init();
myObjectName is whatever name of the object to create.
Then again I have a 2nd choice to create an object, which is much more easier for me to actually turn the Init() into a some sort of a constructor like the code below:
var myObject = function() {
// config anything here to initiate this object.
}
With the code above, I can simply create an object like the following:
window[myObjectName]();
and practically reduces myObject code on having Init() attached to it (and every other object I would do in the factory).
However the 2nd choice comes with a disadvantage I discovered, where I can't use this
inside the object, that I actually have to explicitly use myObject
to call things inside. For example:
var myObject = function() {
myObject.doSomething(); // instead of this.doSomething();
}
Which concerns me a little on variable/object reference (please correct me if I'm wrong).
Any help on these choices' advantages and disadvantages? which do you prefer on both of these choices or can you suggest a better solution?
Thanks.
Upvotes: 2
Views: 84
Reputation: 23668
The second way is actually the preferred one.
this
in JavaScript does not always refer to the current object. You usually keep a reference around to your object so that you don't have to rely on this
.
Even when you write your code with the .Init function I as a caller can override your this by doing a
window[myObjectName].Init.call(mynewthis);
In JavaScript the caller decides on what this
will refer to.
Upvotes: 0
Reputation: 700572
Why not use a constructor function? Both approaches that you suggested requires the object to be created and stored before it can be initialised. You can do like this:
function MyObject() {
this.x = 1;
this.y = 2;
}
You use the new
keyword to create the objects:
window[myObjectName] = new MyObject();
Another advantage with this is that you can use the prototype of the function to add methods to the objects that are created:
MyObject.prototype = {
doSomething: function() {
// do something
}
doMore: function() {
// do more
}
};
Upvotes: 3
Reputation: 115
Arly, in my uderstanding, you should definitely be able to use this.doSomething()
. What is the error you're getting at that line of code?
Upvotes: 0
Reputation: 82048
There are a couple of different ways to create class structures in js. My personal preference, though is for something like your second example.
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.
Upvotes: 1