{ "name": "Object Oriented and Functional Programming", "order": 0.010, "note": [ "Waypoint: Closures", "Waypoint: Factories", "Waypoint: Pure Functions", "Waypoint: Currying Functions", "Waypoint: Functors", "Waypoint: Currying Functions" ], "challenges": [ { "id":"cf1111c1c15feddfaeb1bdef", "title":"Waypoint: A Review On Objects", "difficulty":0, "description":[ "Before we dive into Object Oriented Programming, let's revisit JavaScript objects.", "Give your motorBike object the correct attributes." ], "tests":[ "assert(motorBike.wheels===2, 'You should have given motorBike two wheels');", "assert(motorBike.engine===1, 'You should have given motorBike one engine');", "assert(motorBike.seats===1, 'You should have given motorBike one seat');" ], "challengeSeed":[ "//Here is a sample Object", "var car = {", " \"wheels\":4,", " \"engine\":1,", " \"seats\":5", "};", "", "//Now Let's make a similar Object called motorBike", "//Give it two wheels, one engine and one seat", "var motorBike = {", " \"wheels\":0,", " \"engine\":0,", " \"seats\":0", "};", "", "(function(){return(JSON.stringify(motorBike));})();" ], "challengeType":1 }, { "id":"cf1111c1c15feddfaeb2bdef", "title":"Waypoint: Constructing Objects", "difficulty":0, "description":[ "We are also able to create objects using functions.", "" ], "tests":[ "assert((new Car()).wheels === 4, \"myCar.wheels should be four. Make sure that you haven't changed this value\");", "assert(typeof((new Car()).engine) === 'number', 'myCar.engine should be a number');", "assert(typeof((new Car()).seats) === 'number', 'myCar.seats should be 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(){", " this.wheels = 4;", "};", "", "var myCar = new Car();", "", "(function(){return(JSON.stringify(myCar));})();" ], "challengeType":1 }, { "id":"cf1111c1c15feddfaeb3bdef", "title":"Waypoint: 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', 'We should not been able');", "assert(typeof(myBike.addUnit === '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 }, { "id":"cf1111c1c15feddfaeb4bdef", "title":"Waypoint: 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 }, { "id":"cf1111c1c15feddfaeb7bdef", "title":"Waypoint: Using .map", "difficulty":0, "description":[ "array = array.map(function(val){", " 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 }, { "id":"cf1111c1c15feddfaeb8bdef", "title":"Waypoint: 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){", " 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 }, { "id":"cf1111c1c15feddfaeb9bdef", "title":"Waypoint: 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){", " 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 }, { "id":"cf1111c1c16feddfaeb1bdef", "title":"Waypoint: 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 }, { "id": "cf1111c1c16feddfaeb2bdef", "title": "Waypoint: Using .reverse", "difficulty": 0, "description": [ "You can use the reverse method 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 }, { "id": "cf1111c1c16feddfaeb3bdef", "title": "Waypoint: 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 }, { "id":"cf1111c1c16feddfaeb4bdef", "title":"Waypoint: 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 }, { "id":"cf1111c1c16feddfaeb5bdef", "title":"Waypoint: 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 } ] }