Just for the kicks i am trying to create a simple data object in javascript. Here is the code.
var roverObject = function(){
var newRover = {};
var name;
var xCord;
var ycord;
var direction;
newRover.setName = function(newName) {
name = newName;
};
newRover.getName = function() {
return name;
};
newRover.setDirection = function(newDirection) {
direction = newDirection;
};
newRover.getDirection = function() {
return direction;
};
newRover.setXCord = function(newXCord) {
xCord = newXCord;
};
newRover.getXCord = function() {
return xCord;
};
newRover.setYCord = function(newYCord) {
yCord = newYCord;
};
newRover.getYCord = function() {
return yCord;
};
newRover.where = function(){
return "Rover :: "+ name +" is at Location("+xCord+","+yCord+") pointing to "+direction;
};
return newRover;
};
rover1 = new roverObject();
rover2 = new roverObject();
rover1.setName("Mars Rover");
rover1.setDirection("NORTH");
rover1.setXCord(2);
rover1.setYCord(2);
console.log(rover1.where());
console.log(rover1);
rover2.setName("Moon Rover");
rover2.setDirection("SOUTH");
rover2.setXCord(1);
rover2.setYCord(1);
console.log(rover2.where());
console.log(rover2);
There are few questions that I have around this creation.
- I want to create an object where the properties/attributes of object are private and not visible to world. Am I successful in doing that? Can I really not access the object attributes?
- Is there a better way to create this kind of object?
- If I want to inherit this object, I should do a
newObject.prototype = roverObjectwill that work? And will that make sense most of all. -
Finally I have a wierd problem. Notice the last method of objet “where” which returns a concatenated string. Here I tried following code instead.
newRover.where = function(){ return "Rover :: "+ name +" is at Location("+xCord+","+yCord+") pointing to "+direction; }();
and then did a following console.log
console.log(rover1.where);
console.log(rover2.where);
It threw following error for me:
cannot access optimized closure
Why would it say that? What am I doing wrong?
Thanks for all the help. Any review comments would be appreciated too!
Cheers
Indeed. You don’t have object attributes, you have local variables in the
roverObjectfunction. Local variables can’t be accessed from outside, only from the functions inside theroverObjectfunction that have a closure over them.That you are calling
roverObjectas a constructor, withnew roverObject, is irrelevant, as you are returning a different object from the function. Sayingvar rover1= roverObject()without thenewwould do exactly the same thing. Notably the object returned by[new] roverObjectis a plainObjectas you created it from{};rover1 instanceof roverObjectisfalse.If you wanted
instanceofto work, you would have to call withnew, and usethisinstead ofnewRoverin the constructor function.No. You currently have no allowance for prototyping. You are using a separate copy of each method for each instance of the
roverObject. You can do certainly objects this way but it’s a different approach than prototyping. If you wanted to make something like a subclass ofroverObjectin the arrangement you have now, you’d say something like:Note since the ‘private’ local variables in the base class constructor really are private, even the subclass cannot get at them. There’s no ‘protected’.
What’s that trying to do? I can’t get the error you do; all the above does is assigns the string with the location to
where(before the setter methods have been called, so it’s full of undefineds).Maybe. see this question for a discussion of class/instance strategies in JavaScript.