{ "name": "Object Oriented and Functional Programming", "order": 0.010, "note": [ "Closures", "Factories", "Pure Functions", "Currying Functions", "Functors", "Currying Functions" ], "challenges": [ { "id":"cf1111c1c15feddfaeb1bdef", "title": "Declaring JavaScript Objects as Variables", "difficulty":0, "description":[ "Before we dive into Object Oriented Programming, let's revisit JavaScript objects.", "Give your motorBike object a wheels, engine and seats attribute and set them to numbers." ], "tests":[ "assert(typeof(motorBike.engines) === 'number', 'engines should be have a engines attribute set to a number.');", "assert(typeof(motorBike.wheels) === 'number', 'wheels should be have a engines attribute set to a number.');", "assert(typeof(motorBike.seats) === 'number', 'seats should be have a engines attribute set to a number.');" ], "challengeSeed":[ "//Here is a sample Object", "var car = {", " \"wheels\":4,", " \"engines\":1,", " \"seats\":5", "};", "", "//Now Let's make a similar Object called motorBike", "//Give it two wheels, one engine and one seat", "var motorBike = {", " // Only change code below this line.", "", "", "", " // Only change code above this line.", "};", "", "(function(){return(JSON.stringify(motorBike));})();" ], "challengeType":1, "type": "waypoint", "type": "waypoint" }, { "id":"cf1111c1c15feddfaeb2bdef", "title": "Constructing JavaScript Objects with Functions", "difficulty":0, "description":[ "We are also able to create objects using constructor functions.", "Give your motorBike object a wheels, engine and seats attribute and set them to numbers." ], "tests":[ "assert(typeof((new Car()).engines) === 'number', 'engines should be have a engines attribute set to a number.');", "assert(typeof((new Car()).wheels) === 'number', 'wheels should be have a engines attribute set to a number.');", "assert(typeof((new Car()).seats) === 'number', 'seats should be have a engines attribute set to a number.');" ], "challengeSeed":[ "// Let's add the properties engine and seats to the car in the same way that the property wheels has been added below. They should both be numbers.", "var Car = function(){", " // Only change code below this line.", " this.wheels = 4;", " this.engines = 1;", " this.seats = 1;", "};", "", "var motorBike = new Car();", "// Only change code above this line.", "", "(function(){return(JSON.stringify(myCar));})();" ], "challengeType":1, "type": "waypoint" }, { "id":"cf1111c1c15feddfaeb3bdef", "title":"Understanding Public and Private Properties", "difficulty":0, "description":[ "In the last challenge we use the this to reference public properties the current object or function.", "We can also create variables and functions that aren't accessible from outside the object." ], "tests":[ "assert(typeof(myBike.getSpeed)!=='undefined' && typeof(myBike.getSpeed) === 'function', 'The method getSpeed of myBike should be accessible outside the object');", "assert(typeof(myBike.speed) === 'undefined', 'myBike.speed should remain undefined.');", "assert(typeof(myBike.addUnit === 'undefined'), 'myBike.addUnit should remain undefined.');" ], "challengeSeed":[ "//Let's create an object with a two functions. One attached as a property and one not.", "var Car = function(){", " this.gear = 1;", " function addStyle(styleMe){", " return('The Current Gear Is: ' + styleMe);", " }", " this.getGear = function(){", " return(addStyle(this.gear));", " };", "};", "", "//Make the function getSpeed of Bike publicly accessible", "", "var Bike = function(){", " speed = 100;", " function addUnit(value){", " return(value + \"KM/H\");", " }", " ", " getSpeed = function (){", " return(addUnit(speed));", " };", " ", "};", "", "//Instantiated Here", "var myCar = new Car();", "var myBike = new Bike();", "", "if(myBike.hasOwnProperty('getSpeed')){(function(){return(JSON.stringify(myBike.getSpeed()));})();};" ], "challengeType":1, "type": "waypoint" }, { "id":"cf1111c1c15feddfaeb4bdef", "title":"Instantiation", "difficulty":0, "description":[ "Instantiation at it's most basic level is where you are creating a copy of an object from a template for use at a later time.", "The instance inherits all the properties and methods of the original Object." ], "tests":[ "assert((new Car()).wheels === 4, 'The property wheels should be four in the object constructor');", "assert(typeof((new Car()).engine) === 'undefined', 'There should not be a property engine in the object constructor');", "assert(myCar.wheels === 4, 'The property wheels of myCar should be four');", "assert(typeof(myCar.engine) === 'number', 'The property engine of myCar should be a number');" ], "challengeSeed":[ "var Car = function(){", " this.wheels = 4;", "};", "", "var myCar = new Car();", "", "//Add the property engine to myCar using dot notation and make it a number", "", "", "(function(){return(JSON.stringify(myCar));})();" ], "challengeType":1, "type": "waypoint" }, { "id":"cf1111c1c15feddfaeb7bdef", "title":"Using .map", "difficulty":0, "description":[ "array = array.map(function(val){", "thinsp;thinsp;return(val+1);", "});", "", "The map method is one of the easiest ways to iterate through an array or object there is. Let's use it now." ], "tests":[ "assert.deepEqual(array, [4,5,6,7,8], 'You should have added three to each value in the array');", "assert(editor.getValue().match(/\\.map\\(/gi), 'You should be making use of the map method');", "assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\]/gi), 'You should only modify the array with .map');" ], "challengeSeed":[ "//Use map to add three to each value in the array", "var array = [1,2,3,4,5];", "", "", "", "(function(){return(array);})();" ], "challengeType":1, "type": "waypoint" }, { "id":"cf1111c1c15feddfaeb8bdef", "title":"Using .reduce", "difficulty":0, "description":[ "Reduce can be useful for condensing and array or numbers into one value.", "var singleVal = array.reduce(function(previousVal, currentVal){", "thinsp;thinsp;return(previousVal+currentVal);", "}" ], "tests":[ "assert(singleVal == 30, 'singleVal should have been set to the result of you reduce operation');", "assert(editor.getValue().match(/\\.reduce\\(/gi), 'You should have made use of the reduce method');" ], "challengeSeed":[ "var array = [4,5,6,7,8];", "var singleVal = 0;", "", "", "", "(function(){return(singleVal);})()" ], "challengeType":1, "type": "waypoint" }, { "id":"cf1111c1c15feddfaeb9bdef", "title":"Using .filter", "difficulty":0, "description":[ "filter is a useful method that can filter out values that don't match a certain criteria", "Let's remove all the values less than six", "array = array.filter(function(val) {", "thinsp;thinsp;return(val<4);", "});" ], "tests":[ "assert.deepEqual(array, [1,2,3,4,5], 'You should have removed all the values from the array that are less than six');", "assert(editor.getValue().match(/array\\.filter\\(/gi), 'You should be using the filter method to remove the values from the array');", "assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7\\,8\\,9\\,10\\]/gi), 'You should only be using .filter to modify the contents of the array);" ], "challengeSeed":[ "var array = [1,2,3,4,5,6,7,8,9,10];", "", "", "", "(function(){return(array);})();" ], "challengeType":1, "type": "waypoint" }, { "id":"cf1111c1c16feddfaeb1bdef", "title":"Using .sort", "difficulty":0, "description":[ "You can use the method sort to easily sort the values in the array alphabetically or numerically", "var array = [1,3,2];", "array = array.sort();", "This will return [1, 2, 3]" ], "tests":[ "assert.deepEqual(array, ['alpha', 'beta', 'charlie'], 'You should have sorted the array alphabetically');", "assert(editor.getValue().match(/\\[\\'beta\\'\\,\\s\\'alpha\\'\\,\\s'charlie\\'\\];/gi), 'You should be sorting the array using sort');", "assert(editor.getValue().match(/\\.sort\\(\\)/gi), 'You should have made use of the sort method');" ], "challengeSeed":[ "var array = ['beta', 'alpha', 'charlie'];", "", "", "", "(function(){return(array);})();" ], "challengeType":1, "type": "waypoint" }, { "id": "cf1111c1c16feddfaeb2bdef", "title": "Using .reverse", "difficulty": 0, "description": [ "You can use the .reverse() function to reverse the contents of an array." ], "tests": [ "assert.deepEqual(array, [7,6,5,4,3,2,1], 'You should reverse the array');", "assert(editor.getValue().match(/\\.reverse\\(\\)/gi), '');", "assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7/gi), '');" ], "challengeSeed": [ "var array = [1,2,3,4,5,6,7];", "", "", "", "(function(){return(array);})();" ], "challengeType": 1, "type": "waypoint" }, { "id": "cf1111c1c16feddfaeb3bdef", "title": "Using .concat", "difficulty": 0, "description": [ ".concat() can be used to merge the contents of two arrays into one.", "array = array.concat(otherArray);" ], "tests": [ "assert.deepEqual(array, [1,2,3,4,5,6], 'You should concat the two arrays together');", "assert(editor.getValue().match(/\\.concat\\(/gi), 'You should be using the concat method to merge the two arrays');", "assert(editor.getValue().match(/\\[1\\,2\\,3\\]/gi) && editor.getValue().match(/\\[4\\,5\\,6\\]/gi), 'You should only modify the two arrays without changing the origional ones');" ], "challengeSeed": [ "var array = [1,2,3];", "", "var concatMe = [4,5,6];", "", "", "", "(function(){return(array);})()" ], "challengeType": 1, "type": "waypoint" }, { "id":"cf1111c1c16feddfaeb4bdef", "title":"Using .split", "difficulty":0, "description":[ "You can use the .split() method to split a string into an array.", "split uses the argument you give to to split the string.", "array = string.split(' ');" ], "tests":[ "assert(typeof(array) === 'object' && array.length === 5, 'You should have split the string by it\\'s spaces');", "assert(/\\.split\\(/gi, 'You should have made use of the split method on the string');" ], "challengeSeed":[ "var string = \"Split me into an array\";", "", "var array = string;", "", "(function(){return(array);})();" ], "challengeType":1, "type": "waypoint" }, { "id":"cf1111c1c16feddfaeb5bdef", "title":"Using .join", "difficulty":0, "description":[ "We can use the .join() method to join each element in an array into a string separated by whatever delimiter you provide as an argument to the join operation.", "var joinMe = joinMe.join(\" \");" ], "tests":[ "assert(typeof(joinMe) === 'string' && joinMe === \"Split me into an array\", 'You should have joined the arrays by it\\'s spaces');", "assert(/\\.join\\(/gi, 'You should have made use of the join method on the array');" ], "challengeSeed":[ "var joinMe = [\"Split\",\"me\",\"into\",\"an\",\"array\"];", "", "joinMe = joinMe;", "", "(function(){return(joinMe);})();" ], "challengeType":1, "type": "waypoint" } ] }