Dziedziczenie
w JavaScript
Znajdź swoje korzenie
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657745/father-small.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657777/red-small.png)
Agata Malec - Sromek
Jak myśleć po prototypowemu?
agatajs
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3655897/Twitter_bird_logo_2012.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657699/CodersLab_logo_wektory_color.png)
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ą
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4195924/mysz-zaroslowa.jpg)
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
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657745/father-small.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657722/grand-small.png)
model dziedziczenia
Prototypowy
Nie ma klas, są obiekty.
Obiekty dziedziczą od innych obiektów.
przenieśmy się na inną planetę
Podstawy
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657745/father-small.png)
var alien = {
name: "jlSuDrup",
age: 14521,
sayHello: function () {
console.log("nuqneH");
}
};
var alien = {
name: "jlSuDrup",
age: 14521,
sayHello: function () {
console.log("nuqneH");
}
};
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3607166/alien2.png)
Skąd tajemnicze
atrybuty?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3643052/alien1.png)
var alien = {
name: "jlSuDrup",
age: 14521,
sayHello: function () {
console.log("nuqneH");
}
};
Odwołanie do innego obiektu
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657707/chain-small.png)
[[Prototype]]
__proto__
własność obiektu wskazująca na inny obiekt
.. tak zapisujemy tą własność w specyfikacji
Jak wygląda zwykły obiekt?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4168778/BAF7EUW4HVuL__3_.png)
Obiekty wbudowane + obiekt alien
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4168824/BAF7EUW4HVuL__6_.png)
Czym jest function?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4168830/BAF7EUW4HVuL__7_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4172133/BAF7EUW4HVuL__1_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4172230/BAF7EUW4HVuL__2_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4172239/BAF7EUW4HVuL__3_.png)
Tak wygląda funkcja.
function Alien(name) {
this.name = name;
}
console.dir(Alien);
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4172292/Zrzut_ekranu_2017-09-28_o_19.14.15.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4168666/BAF7EUW4HVuL__1_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657738/grand-small.png)
Object
Ojciec wszystkich ojców
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657738/grand-small.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4193107/BAF7EUW4HVuL.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4193113/object.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3607166/alien2.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4168824/BAF7EUW4HVuL__6_.png)
Jakie gatunki mieszkają
na planecie Prototypia?
Typy dziedziczenia
Delegate prototype
1 typ
var A = {};
Łączenie obiektów
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4172848/BAF7EUW4HVuL__5_.png)
var B = Object.create(A);
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4172860/BAF7EUW4HVuL__5_.png)
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";
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3657777/red-small.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/3651680/alienA.png)
Połączenie
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4193199/BAF7EUW4HVuL__2_.png)
Przy większej ilości obiektów pomoże nam Fabryka
Factory function
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4178295/factory.png)
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
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4197891/BAF7EUW4HVuL__9_.png)
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
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4195991/BAF7EUW4HVuL__3_.png)
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
![](https://s3.amazonaws.com/media-p.slid.es/uploads/590109/images/4197916/BAF7EUW4HVuL__10_.png)
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
- 665