2

I had the following question in a test today. But i had not see something like functionName.VariableName before. Not sure how that works.

Would be great if you can tell me the solution:

function Item(itemName)
{
    var next_item_id = 1;

    Item.item_name = itemName;
    Item.item_id = next_item_id++;
}

var Item1 = Item('Desktop');
var Item2 = Item('Laptop');
var Item3 = Item('Monitor');
  1. Anything wrong with the code above? if yes fix it. (The problem i would see is next_item_id is always 1, need to make it global?)
  2. Modify the function so that the variable “next_item_id”, cannot be modified during run time.
  3. My own question, how does the variable like Item.item_name work? I want to google it, but not sure what I should search for.

Thanks.

4 Answers 4

2
  1. Your thinking is close in that next_item_id will always be 1, but it's generally not recommended to pollute the global namespace. Instead, wrap it in an anonymous function:

    (function() {
      var next_item_id = 1;
    
      function Item(itemName)
      {
          //Use "this" to apply the property to the instance only
          this.item_name = itemName;
          this.item_id = next_item_id++;
      }
    
      var Item1 = new Item('Desktop');
      var Item2 = new Item('Laptop');
      var Item3 = new Item('Monitor');
    })()
    

Also, as in Java, the general best practice in Javascript is to use camelCase rather than under_scores. Constructors are generally in UpperCamelCase. Examples:

Array //UpperCamelCase
Object.prototype.toString //toString is camelCase
  1. This question is ambiguous, and, depending on the interpretation, there can be a number of possible answers. next_item_id is a "var" declared inside a function and naturally has an internal [[DontDelete]] and [[DontEnum]] flag. If it's a "var" and we're not using "this" as shown in my modified code, the variable is inherently not accessible outside of the function or its nested functions and therefore cannot be modified. You can use the non-standard const or you can create an object and use Object.defineProperty to create a setter that returns false assuming an ES5-compatible environment, etc.

  2. Functions are objects in Javascript. All objects can have "properties."

Sign up to request clarification or add additional context in comments.

Comments

2

Javascript functions are also objects and can have properties.

They behave like static fields in Java.

1 Comment

+1, This is the only correct answer given. It appears everyone else wanted to "solve" the test question instead of answering the OP's actual question.
2

You're going about it all wrong. I'm assuming that you want to set internal variables.

If you want to create a 'constructor', do something like this:

function Item(itemName)
{
    var next_item_id = 1;

    this.item_name = itemName;
    this.item_id = next_item_id++;
}

var Item1 = new Item('Desktop');
var Item2 = new Item('Laptop');
var Item3 = new Item('Monitor');

Both item_name and item_id will be publicly available. To make use next_item_id like you want, try this:

Item.next_item_id = 1;

Then in your constructor, do Item.next_item_id++;

Your final code should look something like this:

function Item(itemName)
{
    this.item_name = itemName;
    this.item_id = Item.next_item_id++;
}

Item.next_item_id = 1;

var Item1 = new Item('Desktop');
var Item2 = new Item('Laptop');
var Item3 = new Item('Monitor');

What this is doing is attaching a property to the object Item. You might be thinking, "Item is a function! How is this possible?!". Nearly everything in JavaScript is an object with mutable properties. The only things that aren't are the keywords null and undefined (AFAIK).

Item is still a function, but it also has a property next_item_id.

Also, using new will create a new instance. This is a similar concept as in Java and other programming languages. Just calling Item is like calling a function, and you'll get back whatever is returned from it (through an explicit return statement, otherwise undefined).

Comments

0

Answer for question 2 : Modify the function so that the variable “next_item_id”, cannot be modified during run time.

If I have interpreted your question correctly, you want to have Item.item_id as a constant that cannot be modified any where outside the constructor. I don't think we can have constants in JS.

Item1.item_id = someValue 

Above line, used some where can change the item_id value of Item1.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.