Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Object Creation in javascript

Tags:

javascript

oop

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.

  1. 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?
  2. Is there a better way to create this kind of object?
  3. If I want to inherit this object, I should do a newObject.prototype = roverObjectwill that work? And will that make sense most of all.
  4. 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

like image 407
Priyank Avatar asked Dec 31 '09 04:12

Priyank


People also ask

How do you create an object in JavaScript?

To create an object, use the new keyword with Object() constructor, like this: const person = new Object(); Now, to add properties to this object, we have to do something like this: person.

What are the steps in object creation?

Declaration − A variable declaration with a variable name with an object type. Instantiation − The 'new' keyword is used to create the object. Initialization − The 'new' keyword is followed by a call to a constructor. This call initializes the new object.

What is create an object?

When you create an object, you are creating an instance of a class, therefore "instantiating" a class. The new operator requires a single, postfix argument: a call to a constructor. The name of the constructor provides the name of the class to instantiate. The constructor initializes the new object.

What is JavaScript object with example?

In JavaScript, an object is a standalone entity, with properties and type. Compare it with a cup, for example. A cup is an object, with properties. A cup has a color, a design, weight, a material it is made of, etc.


1 Answers

Am I successful in doing that? Can I really not access the object attributes?

Indeed. You don't have object attributes, you have local variables in the roverObject function. Local variables can't be accessed from outside, only from the functions inside the roverObject function that have a closure over them.

That you are calling roverObject as a constructor, with new roverObject, is irrelevant, as you are returning a different object from the function. Saying var rover1= roverObject() without the new would do exactly the same thing. Notably the object returned by [new] roverObject is a plain Object as you created it from {}; rover1 instanceof roverObject is false.

If you wanted instanceof to work, you would have to call with new, and use this instead of newRover in the constructor function.

If I want to inherit this object, I should do a newObject.prototype = roverObject will that work? And will that make sense most of all.

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 of roverObject in the arrangement you have now, you'd say something like:

function AdvancedRover() {
    var rover= new roverObject();
    rover.doResearch= function() {
        return rover.where()+' and is doing advanced research';
    };
    return rover;
}

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

newRover.where = function(){ ... }();

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

Is there a better way to create this kind of object?

Maybe. see this question for a discussion of class/instance strategies in JavaScript.

like image 85
bobince Avatar answered Sep 30 '22 20:09

bobince