Object creation

Module Pattern - används för namespacing

const ModuleName = (function(){
  return {
    moduleFunction: function(){
      console.log('I am a function inside of an object, nothing more.');
    }
  }
})();

ModuleName.moduleFunction();
Namespacing any serious script or application is critical as it's important to safeguard our code from breaking in the event of another script on the page using the same variable or method names we are.
Ref: Namespacing Patterns

Lagrar variabler i en closure så att de blir "privata"

const DwarvesModel = (function(){
  let dwarves = ['Toker', 'Blyger','Trötter', 'Prosit','Kloker', 'Butter','Glader'];

  return {
    getDwarves: function(){
      return dwarves;
    },
    clearDwarves: function(){
      dwarves = [];
    }
  }
})();

Skapa objekt

Skapa en Objekt Literal

const anObject = {}

Ett "vanligt" objekt som sparas i variablen anObject

Duger bra i många scenarion

Constructor Call

function Taco(topping, bread){
  this.topping = topping;
  this.bread = bread;
}
let aNiceTaco = new Taco(["Meat"], "Tortilla");

Vi skapar ett objekt av en viss typ, i detta fall: Taco

Stor bokstav på funktionsnamnet gör ingenting, det är fortfarande en vanlig funktion

function Taco(topping, bread){
  this.topping = topping;
  this.bread = bread;
  this.addTopping = function(newTopping){
    this.topping.push(newTopping);
  }
}

thispekar på varje enskilt nytt objekt av typen taco

Vi kan lägga till funktioner som manipulerar olika tacos

Constructor Call Pattern

Du vill ha viss logik kopplat till ett visst objekt

Du vill att ett objekt ska vara av en viss typ och ärva speciella egenskaper

Du skriver funktionerna för ett objekt en gång och sedan ärvs dessa funktioner till varje nytt objekt.

Objekt är alltid länkade till ett annat objekt

Det sista i kedjan är Object

Samma som med scope så kommer JavaScript söka sig uppför denna kedja för att hitta det den söker

Scope

Skapa en kopia av ett objekt

Object.assign()

let person1 = {
  name: "Jorge"
}
let person2 = Object.assign({}, person1);

Bästa sättet att kopiera ett objekt rakt av

Skapa ett nytt objekt baserat på ett annat

Object.create()

let person1 = {
  name: "Jorge"
}

let person2 = Object.create(person1);

Det som gör att allting är länkat till varandra kallas Prototypkedjan

Varje objekt har en egenskap som heter prototyp och som ärvs mellan objekt.

Prototypkedjan är grunden för hur allt i JavaScript fungerar

function Taco(topping, bread){
  this.topping = topping;
  this.bread = bread;
  this.addTopping = function(newTopping){
    this.topping.push(newTopping);
  }
}
function Taco(topping, bread){
  this.topping = topping;
  this.bread = bread;
}

Taco.prototype.addTopping = function(newTopping){
  this.topping.push(newTopping);
}

Övningar finns på Zenit/GitHub

Prototyper och objekt är grunden för allt inom JavaScript