Dziedziczenie
w JavaScript
Znajdź swoje korzenie
Agata Malec - Sromek
Jak myśleć po prototypowemu?
agatajs
Czym się zajmuję?
Mentoruję, programuję a także
opiekuję się kursem Front-end-owym w
Jesteś Bogiem.
Planeta:
Model dziedziczenia:
Ziemia
Klasyczny
Nośnik informacji:
DNA
Osobniki kopiują niektóre cechy między sobą
model dziedziczenia
Klasyczny
Klasa pochodna dziedziczy od klasy bazowej.
Obiekty są kopiami klas.
Planeta:
Model dziedziczenia:
Prototypia
Prototypowy
Nośnik informacji:
łańcuch
Osobniki korzystają z cech innych osobników
model dziedziczenia
Prototypowy
Nie ma klas, są obiekty.
Obiekty dziedziczą od innych obiektów.
przenieśmy się na inną planetę
Podstawy
var alien = {
name: "jlSuDrup",
age: 14521,
sayHello: function () {
console.log("nuqneH");
}
};
var alien = {
name: "jlSuDrup",
age: 14521,
sayHello: function () {
console.log("nuqneH");
}
};
Skąd tajemnicze
atrybuty?
var alien = {
name: "jlSuDrup",
age: 14521,
sayHello: function () {
console.log("nuqneH");
}
};
Odwołanie do innego obiektu
[[Prototype]]
__proto__
własność obiektu wskazująca na inny obiekt
.. tak zapisujemy tą własność w specyfikacji
Jak wygląda zwykły obiekt?
Obiekty wbudowane + obiekt alien
Czym jest function?
Tak wygląda funkcja.
function Alien(name) {
this.name = name;
}
console.dir(Alien);
Object
Ojciec wszystkich ojców
Jakie gatunki mieszkają
na planecie Prototypia?
Typy dziedziczenia
Delegate prototype
1 typ
var A = {};
Łączenie obiektów
var B = Object.create(A);
var greenAlien = {
sayHello: function() {
return `Hello, my name is ${ this.name }`
}
}
var redAlien = Object.create(greenAlien);
redAlien.fly = function() {
console.log('I can fly');
}
var alienA = Object.create(greenAlien);
alienA.name = "Optimus";
var alienB = Object.create(redAlien);
alienB.name = "Clark";
Połączenie
Przy większej ilości obiektów pomoże nam Fabryka
Factory function
const alien = {
sayHello () {
return `Hello, my name is ${ this.name }`;
}
};
const createAlien = (name) => {
return Object.assign(Object.create(alien), {
name
});
}
const clark = createAlien('Clark');
clark.sayHello();
Factory function
Factory function
Factory function
vs.
constructor function
function Alien(name) {
this.name = name;
}
Alien.prototype.sayHello = function() {
return `Hello, my name is ${ this.name }`;
}
let clark = new Alien('Clark');
console.log(clark.sayHello());
Constructor function
Musimy używać new
wykorzystujące jest bardziej skomplikowane niż
wykorzystujące .
Prototypowe dziedziczenie
konstruktory
Prototypowe dziedziczenie
prototypy
let clark = new Alien('Clark');
Problem z new
"new" is a remnant of the days where JavaScript accepted a Java like syntax for gaining "popularity"
Concatenative Inheritance
2 typ
const alien = {
sayHello () {
return `Hello, my name is ${ this.name }`;
}
};
const clark = Object.assign(
{},
alien,
{name: 'Clark'}
);
clark.sayHello()
Concatenative / Cloning
Podsumowanie
const alien = {
sayHello () {
return "Hello";
}
};
Jeden obiekt
function createAlien() {
return {
name: 'Clark'
};
}
var alienA = createAlien();
Wiele obiektów
const alienPrototype = {
sayHello: function sayHello() {
return "Hello"
}
};
function createAlien() {
return Object.create(alienPrototype);
}
const alienA = createAlien();
Dziedziczenie
function Alien() { }
Alien.prototype.sayHello = function sayHello() {
return "Hello"
}
const alienB = new Alien();
tak nie róbmy
function createBulb() {
let isOn = false // private
return {
turnOn: function turnOn() {
isOn = true
return this;
},
turnOff: function turnOff() {
isOn = false;
return this;
},
isOn: function isOnMethod() {
return isOn;
}
};
}
var bulb = createBulb();
Hermetyzacja
https://github.com/gnodi/danf
http://docs.sencha.com/extjs/4.0.7/#!/api/Ext
Dobry kod gdzie nie ma new.
https://www.youtube.com/watch?v=ya4UHuXNygM&t=50m23s
Dlaczego David Crockford nie używa new?
Dziedziczeniew JavaScript
By Agata Malec
Dziedziczeniew JavaScript
Programistok
- 691