Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

JavaScript Object-Oriented JavaScript (2015) Constructor Functions and Prototypes Make a Constructor Challenge

Make a Constructor Challenge - My Dice Simulator

I accepted Andrew's challenge. Here is my Dice Simulator.

dice.js
/**
  * By default, new objects created by the Dice constructor will
  * be 6-sided or the value of sides, if defined.
  *
  * It's assumed sides will be a number - i.e. I'm too lazy to validate the input
  */
function Dice(sides) {
  this.sides = sides || 6;
  this.roll = function () {
    return Math.floor(Math.random() * this.sides) + 1;    
  };
}

var d6 = new Dice();
var d20 = new Dice(20);

4 Answers

Matt F.
Matt F.
9,518 Points

Very cool. Just tried it out and works great.

Right now I am learning about the prototype chain from materials produced by Kyle Simpson and one suggestion may be to add the role method to the .prototype of the Dice function. This way, if you for some reason had 10,000 dice, it would not require a separate role method in each object.

Again great work.

Hi Matt,

Thanks for the feedback! You're right on about prototyping a roll method, which is useful for inheritance. At this point in the course, Andrew hasn't talked about prototyping yet, so I wanted to keep it as close to the covered material as possible.

In the spirit of prototyping, here is an updated version. I'm so glad you mentioned this, because I had nearly forgotten that major benefit of prototyping - code isn't copied for each new object, they instead refer to the one copy from their parent.

function Dice(sides) {
  this.sides = sides || 6;
}

Dice.prototype.roll = function() {
  return Math.floor(Math.random() * this.sides) + 1;
}

var d6 = new Dice();
var d20 = new Dice(20);

// this time, each new object does not hold a copy of the roll function
// so instead, each object refers to the prototype in the parent.
Mohsen Qaddoura
Mohsen Qaddoura
22,237 Points
// can't add much to the beautiful answer preceding this one
function Dice(sides) {
    this.sides =  sides || 6;  
    this.roll = function() {
      return Math.floor(Math.random() * this.sides) + 1;
    };
}

dice6 = new Dice();
dice10 = new Dice(10);

console.log(dice10.roll());  /*  Example for logging out
 the return value of the roll method to the console.  */

i believe this is right ''' function Dice(sides) { this.sides = sides; this.roll = function{ Math.floor(Math.random() * this.sides) + 1;

}; } '''

Mohsen Qaddoura
Mohsen Qaddoura
22,237 Points
/* You missed: 1- "()" after "function".   2- and the "return" keyword in:
 this.roll = function{ Math.floor(Math.random() * this.sides) + 1;
};

so it finally should look like this to run without errors and get some output of your code:

    this.roll = function() {
      return Math.floor(Math.random() * this.sides) + 1;
    }; 

also modify, at the very beginning of your code, the " ``` " to " ```JavaScript " for your code to be shown formatted as code here on the forum. Best of luck you are doing well and keep at it :)

*/ 

tyvm :)