I’m working on a fairly complex object in JS and I’m running into issues:
I have the following (abridged) code:
var LocationSelector;
LocationSelector = function(container) {
this.selectors = {
container: container,
city_name: container.find('input.city_name'),
city_id: container.find('input.city_id')
};
return this.initialize();
};
LocationSelector.prototype = {
initialize: function() {
return this.city.checkStatus();
},
city: {
status: null,
message: null,
id: null,
checkStatus: function() {
if (LocationSelector.selectors.city_name.val() && LocationSelector.selectors.city_id.val()) {
return LocationSelector.city.setStatus('success');
}
},
setStatus: function(status) {
return alert(status);
}
}
};
Two questions:
1) Inside of a sub-object function this no longer refers back to the root object. It seems I can refer back to the parent if I write out LocationSelector.object.method( args ), but that’s a lot to type. Is there a way to define a shortcut back to the parent object?
2) In some situations I need to have several instances of this per page, so it’s important to me that I can set the various selectors when a new object is instantiated and then refer to the instance selectors in the prototype. Is referring to the parent object (ie. LocationSelector) in sub-object methods even viable for that? How does JS know to stay with the currently active object’s stored properties?
Basically, I’m trying to implement a class, and I’m totally new to JS and don’t really know how to do it. So, any help or suggestions are appreciated. Thanks!
There are many things wrong with your current approach. Here is something closer to what you want, although I do not understand why
LocationSelectorinstances have acitymember.Things to note:
Cityis clearly its own class, so you should make it one. In your code, a single city is being shared between all instances ofLocationSelector, since it is put on the prototype. In this code, it is assigned as an instance property, in theLocationSelectorconstructor.LocationSelector.selectorslike you do in your example.LocationSelector.selectorswould be for “static” properties, whichLocationSelectordoes not have. Instead you need to refer to theselectorsproperty on specific instances; in this example, that instance is given bythis.locationSelector.Cityinstance cannot reference to properties of the “parent”LocationSelectorclass without having a concrete instance of it.Here is a version of the code that makes more sense to me, removing the part where
LocationSelectorhas acityproperty (which it doesn’t use).I leave you with a link to Crockford’s “Private Members in JavaScript”, which talks about doing OO in JavaScript. There are other, probably better explanations out there, but at least that one will put you on the right track.