sandra-larsson
Educator Fullstack Developer Javascript at Chas Academy
JavaScript
(oavsett programspråk)
{
PROPERTIES:
username
password
email
METHODS:
login(username, pwd) {
//Logisk för login
}
createPost(str) {
// Logik för att
// skapa inlägg
}
}
{
PROPERTIES:
username = "Fritioff"
password = "123"
email = fritt@tech.com
METHODS:
login(username, pwd) {
//Logisk för login
}
createPost(str) {
// Logik för att
// skapa inlägg
}
}
{
PROPERTIES:
username = "Barbara"
password = "456"
email = barba@tech.com
METHODS:
login(username, pwd) {
//Logisk för login
}
createPost(str) {
// Logik för att
// skapa inlägg
}
}
Att skapa en enkel modell av något mer komplext och endast
visa det som behövs för att interagera med objektet.
Abstraktion i OOP döljer detaljer och visar endast det
nödvändiga av ett objekt vilket resulterar i ett enklare interface
till objektet.
Processen som involverar att organisera funktioner och variabler i
separata enheter. Där en enhet inom OOP är ett objekt.
Ett objekt inom OOP kallas variabler för egenskaper och funktioner
kallas istället metoder
let salary = 25000;
let overtime = 15;
let rate = 100;
function getMonthlyWage(salary, overtime, rate) {
return salary + (overtime * rate);
}
getMonthlyWage(salary, overtime, rate);
Procedurell, ej inkapsling i JS
let employee = {
salary: 25000,
overtime: 15,
rate: 100,
getMonthlyWage() {
return this.salary + (this.overtime * this.rate)
}
};
employee.getMonthlyWage();
Exempel på inkapsling i JS
(men vi kommer senare till hur det görs mer konkret för OOP i JS)
För att inte upprepa oss i kod kan vi låta objekt ärva egenskaper
och metoder från andra objekt
Mantra: Don’t Repeat Yourself !
{
PROPERTIES:
username
password
email
METHODS:
login(username, pwd) {
//Logisk för login
}
createPost(str) {
// Logik för att
// skapa inlägg
}
}
{
PROPERTIES:
username
password
email
permissions
METHODS:
login(username, pwd) {
//Logisk för login
}
createPost(str) {
// Logik för att
// skapa inlägg
}
deleteUser(user) {
// Logik för att ta bort
}
}
Hänvisar till att olika typer av objekt kan implementera samma
egenskap och/eller metoder men att de också kan implementera
egna specifika varianter av dessa.
const num = [7, 11, 13]
num.map(element => element * 10)
Array.prototype är prototypen för alla array-objekt vi skapar i Javascript. Därför kan alla arrays som skapas få åtkomst till map() och fler som finns i denna prototype.
👈
👈
Testar denna del för
grundförståelse
Sen all-in för detta sätt
this i JavaScript är ett nyckelord som används för att referera till det kontextuella objektet inom en funktion. Beteendet för this varierar beroende på hur funktionen anropas:
function Person(name, age) {
this.name = name
this.age = age
}
const person1 = new Person("Tim", 31)
const person2 = new Person("Tommy", 32)
console.log(person1.name) // Tim
console.log(person2.age) // 32
Varje objekt/funktion som skapas har en Prototype. Därför kan vi alltså lägga till metoder/funktioner på dess Prototype!
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.sayHello = function() {
return "Hello, " + this.name;
};
const person1 = new Person("Tim", 31)
console.log(person1.sayHello())
Song
: Skapa en konstruktorfunktion Song
som initieras med egenskaper som title
, artist
, och duration
.playSong
: Lägg till en metod playSong
som skriver ut "Playing [title] by [artist]"
.Song
, till exempel en låt med titeln "Happy" av "Pharrell" och en annan med titeln "Imagine" av "John Lennon".playSong
: Anropa playSong
på båda instanserna och verifiera att utskriften är korrekt.Varje metod/egenskap som läggs till på ett objekts prototyp kommer att vara åtkomlig till alla instanser som är länkade till den prototypen. Det görs genom __proto__.
Person
Person
Prototype
Tim
Tommy
.constructor
.prototype
__proto__
Det nya sättet som liknar hur OOP skrivs i andra språk!
Använd dig av detta, men kom ihåg att prototype och protoype inheritance är det underliggande sättet!
Endast en omskrivning, syntaxtiskt socker för att efterlikna syntax i andra objektorienterade programspråk.
class Person {
constructor(name, age) {
this.name = name
this.age = age
}
sayHello = function() {
return "Hello, " + this.name;
}
}
const person1 = new Person("Tim", 31)
console.log(person1.sayHello())
Med hjälp av en konstruktor så kan vi låta vissa värden i vårt
objekt sättas direkt när objektet skapas vilket kan vara väldigt
användbart. En konstruktor kan även innehålla en metod som anropas när objektet skapas. En konstruktor kan utelämnas, då skapas endast ett tomt objekt.
class Polygon {
constructor(height, width) {
this.h = height;
this.w = width;
}
showPolygon() {
console.log(`The height of the polygon ${this.h} and width ${this.h}`)
}
}
Skapa den underliggande koden för ett receptprogram.
Skapa en klass som representerar recept.
Varje recept ska ha: - titel - beskrivning -
tidsåtgång - ingredienslista (array []) - tillredningssteg
(array[])
Det ska finnas en konstruktor och ett antal metoder för att
pusha/poppa in nya element till arrayerna. Man kan även lägga till
t.ex. en metod som skriver ut allt som har med receptet att göra
e.g. printRecipe. Kom även på övriga metoder som skulle kunna läggas till
Statiska metoder defineras på klassen. Man anropar en statisk metod genom att använda klassnamnet, inte instansobjektet. Man använder det reserverade ordet static för att ange om metoden eller egenskapen är static. Man behöver alltså inte skapa ett nytt objekt för att använda funktionen (konstruktorn "hoppas" över)
# JS OOP
class Square {
constructor(side) {
this.side = side;
}
findPerimeter() {
return 4 * this.side;
}
static comparePerimeter(square1, square2) {
if (square1.side > square2.side) {
console.log("First square has more perimeter");
} else if (square1.side < square2.side) {
console.log("Second square has more perimeter");
} else {
console.log("Both have same perimeter");
}
}
}
let square1 = new Square(3);
let square2 = new Square(7);
Square.comparePerimeter(square1, square2);
Ingår ej i inlämningsuppgiften
Genom att använda extends ärvs en klass metoder från en klass till en annan
klass. Den ärvda klassen kan innehålla fler egenskaper utöver de som är specifika för den klassen. Genom att anropa metoden super() i Child klassen anropar vi förälderns konstruktormetod och får tillgång till förälderns (måste användas) egenskaper och metoder.
class Car {
constructor(brand) {
this.carname = brand;
}
present() {
return 'I have a ' + this.carname;
}
}
class Model extends Car {
constructor(brand, model) {
super(brand);
this.model = model;
}
show() {
return this.present() + ', it is a ' + this.model;
}
}
const mycar = new Model("Ford", "Mustang");
# PRESENTING CODE
Getters och Setters används ofta i Klasser. Om du vill lägga till
getters och setters i klassen använder du nyckelorden get och set.
class Car {
constructor(brand) {
this.carname = brand;
}
get carName() {
return this.carname;
}
set carNme(x) {
this.carname = x;
}
}
Getters och setters används kunna komma
åt egenskaper som vi sätter vill ska vara privata (inkapslade). D.v.s vi ändrar inte på själva objektet utan använder get- och setmetoder som är publika men som har åtkomsta att modifiera privat data.
Ett ganska nytt tillägg till JavaScript är möjligheten att lägga in
privata egenskaper och metoder i dina klasser. Dessa går enbart
att komma åt inuti klassen eller om det är egenskaper kan vi
komma åt dem med getters och setters.
class ClassWithPrivate {
#privateField;
#privateFieldWithInitializer = 42;
#privateMethod() {
// ...
}
}
För att göra en egenskap eller metod privat lägger du helt enkelttill # innan namnet.
By sandra-larsson