Prototype
Στην JavaScript, όλα τα αντικείμενα έχουν ένα πεδίο πρωτοτύπου (prototype), ένα αντικείμενο δηλαδή από το οποίο κληρονομούνται ιδιότητες και μέθοδοι. Καθώς το πεδίο πρωτοτύπου είναι και αυτό αντικείμενο, τότε και αυτό έχει ένα πεδίο πρωτοτύπου, το οποίο μπορεί να έχει ένα άλλο πεδίο πρωτοτύπου και ούτω καθεξής. Αυτό ονομάζεται Αλυσίδα Πρωτοτύπων (Prototype Chain)
.
Μπορούμε να προσπελάσουμε το πεδίο πρωτοτύπου ενός αντικειμένου με την ιδιότητα __proto__
.
const person = {
name: "John",
age: 30,
city: "New York"
};
console.log(person.__proto__); // { constructor: f Object(), __defineGetter__: f, __defineSetter__: f, ... }
Όταν καλούμε μια ιδιότητα ενός αντικειμένου, η JavaScript πρώτα ψάχνει την ιδιότητα στο ίδιο το αντικείμενο. Αν δεν βρει την ιδιότητα, τότε ψάχνει στο πεδίο πρωτοτύπου του αντικειμένου.
Στο παρακάτω παράδειγμα, η συνάρτηση sayHello()
δεν ορίζεται στο αντικείμενο john
, αλλά στο πεδίο πρωτοτύπου της κλάσης Person
. Αυτό σημαίνει ότι όλα τα αντικείμενα που δημιουργοϋνται από την κλάση Person
θα έχουν πρόσβαση στη μέθοδο sayHello()
.
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};
const john = new Person("John", 30);
john.sayHello(); // "Hello, my name is John and I am 30 years old."