Összefoglaló: ebben a bemutatóban megtanulod, hogyan működik a JavaScript prototípusos öröklés.
Bevezetés a JavaScript prototípusos öröklésbe
Ha dolgoztál már más objektumorientált programozási nyelvekkel, például a Javával vagy a C++-val, akkor már ismered az öröklés koncepcióját.
Ebben a programozási paradigmában az osztály egy tervrajz az objektumok létrehozásához. Ha azt szeretnénk, hogy egy új osztály újra felhasználja egy meglévő osztály funkcionalitását, létrehozhatunk egy új osztályt, amely kiterjeszti a meglévő osztályt. Ezt nevezzük klasszikus öröklésnek.
A JavaScript nem használ klasszikus öröklést. Ehelyett prototípusos öröklést használ.
A prototípusos öröklésben egy objektum tulajdonságokat “örököl” egy másik objektumtól a prototípuskapcsolaton keresztül.
JavaScript prototípusos öröklés és __proto__
Vegyünk egy példát, hogy érthetőbbé tegyük a fogalmat.
A következőkben egy person
objektumot definiálunk:
Code language: JavaScript (javascript)
A person
objektumnak két tulajdonsága van:
-
name
amely egy string értéket tartalmaz. -
greet
amely egy értéket tartalmaz, amely történetesen egy függvény. Agreet
aperson
objektum metódusaként ismert.
A JavaScript alapértelmezés szerint egy Object()
függvényt és egy prototípus objektumot biztosít, amely a Object()
függvény prototype
tulajdonságán keresztül érhető el:
Ha egy objektum meghatározásához az objektum literál szintaxist használjuk, az objektum a Object
példánya. Ezért a person instanceof Object
kifejezés true
:
Code language: JavaScript (javascript)
Kimenet:
Code language: JavaScript (javascript)
A person
objektum a ]
kötésen keresztül a Object.prototype
objektumhoz is kapcsolódik.
Más szóval a person
objektumon keresztül a Object.prototype
objektum bármely tulajdonságához hozzáférhetünk. Például:
Code language: JavaScript (javascript)
Kimenet:
Code language: JavaScript (javascript)
A az alapértelmezett konverzió egy objektumból stringgé.
Az person
objektumon a toString()
metódus hívásakor a JavaScript nem találja meg. Ezért a JavaScript követi a prototípusláncot, és a Object.prototype
objektumon keresi a metódust. A JavaScript megtalálja a toString() metódust a Object.prototype
objektumon, és végrehajtja.
A person
objektum prototípusának eléréséhez használhatjuk a __proto__
tulajdonságát:
Code language: JavaScript (javascript)
Kimenet:
Code language: JavaScript (javascript)
A következőkben egy másik, teacher
nevű objektumot definiálunk. A teacher
objektum rendelkezik a teach()
metódussal:
Code language: JavaScript (javascript)
Ha azt szeretnénk, hogy a teacher
objektum hozzáférjen a person
objektum összes tulajdonságához, akkor a teacher
objektum prototípusát a person
objektumra állíthatjuk:
Code language: JavaScript (javascript)
Figyeljen arra, hogy a __proto__
-t soha ne használja a gyártási kódban. Ez csak tanulási és megértési célokat szolgál.
Most a teacher
objektum a person
objektum name
tulajdonságához és greet()
metódusához férhet hozzá a prototípusláncon keresztül:
Code language: JavaScript (javascript)
Kimenet:
Code language: JavaScript (javascript)
Mikor a greet()
metódust hívjuk a teacher
objektumon, a JavaScript először a teacher
objektumon találja meg.
Mivel a JavaScript nem találja a metódust a teacher
objektumon, követi a prototípusláncot, és a person
objektumon keresi a metódust. Ezúttal a JavaScript megtalálja a metódust a person
objektumon, és végrehajtja a greet()
metódust.
A JavaScriptben azt mondjuk, hogy a teacher
objektum örökli a person
objektum tulajdonságait. Ez pedig a prototípusos öröklés.
A prototípusos öröklés megvalósításának szabványos módja az ES5-ben
Az ES5 szabványos módot biztosított a prototípusos örökléssel való munkához a Object.create()
metódus használatával.
Megjegyezzük, hogy most már az újabb ES6 class
és extends
kulcsszavakat kell használni az öröklés megvalósításához. Ez sokkal egyszerűbb.
A Object.create()
módszer létrehoz egy új objektumot, és egy meglévő objektumot használ az új objektum prototípusaként:
Code language: JavaScript (javascript)
A Object.create()
módszer két argumentumot fogad el:
- Az első argumentum (
proto
) az új objektum prototípusaként használt objektum. - A második argumentum (
propertiesObject
), ha megadjuk, egy opcionális objektum, amely az új objektum további tulajdonságait határozza meg.
Tegyük fel, hogy van egy person
objektum:
Code language: JavaScript (javascript)
A következőkben létrehozunk egy üres teacher
objektumot a person
objektum __proto__
-ével:
Code language: JavaScript (javascript)
Ezután definiálhatjuk a teacher
objektum tulajdonságait:
Code language: JavaScript (javascript)
Vagy mindezeket a lépéseket egyetlen utasításban is elvégezhetjük a következőképpen:
Code language: JavaScript (javascript)
Az ES5 bevezette a Object.getPrototypeOf()
metódust is, amely visszaadja egy objektum prototípusát. Például:
Code language: JavaScript (javascript)
Kimenet:
Code language: JavaScript (javascript)
Summary
- Az öröklés lehetővé teszi, hogy egy objektum egy másik objektum tulajdonságait és módszereit használja.
- A JavaScript prototípusos öröklést használ, amelyet a prototípusok összekapcsolásával érünk el.
- Az oktatóanyag hasznos volt?
- IgenNem
.