Uczę się prototypu od You Don't Know JS: this & Object Prototypes , która jest wspaniałą książką do zrozumienia projektu poniżej i wyjaśnienia wielu nieporozumień (dlatego staram się unikać dziedziczenia i tym podobnych instanceof).
Ale mam takie samo pytanie, jak ludzie tutaj zadawali. Kilka odpowiedzi jest naprawdę pomocnych i pouczających. Chciałbym również podzielić się swoimi zrozumieniami.
Co to jest prototyp?
Obiekty w JavaScript mają wewnętrzną właściwość, oznaczoną w specyfikacji jako [[Prototype]], która jest po prostu odwołaniem do innego obiektu. Niemal wszystkie obiekty otrzymują nullw tej chwili wartość dla tej właściwości.
Jak zdobyć prototyp obiektu?
przez __proto__lubObject.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
Co to jest prototype?
prototypeto obiekt tworzony automatycznie jako specjalna właściwość funkcji , która służy do ustanowienia łańcucha delegowania (dziedziczenia), czyli łańcucha prototypów.
Kiedy tworzymy funkcję a, prototypejest ona automatycznie tworzona jako specjalna właściwość ai zapisuje kod funkcji jako constructorwłączony prototype.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
Chciałbym rozważyć tę właściwość jako miejsce do przechowywania właściwości (w tym metod) obiektu funkcji. Z tego powodu funkcje narzędziowe w JS są zdefiniowane jako Array.prototype.forEach():Function.prototype.bind() ,Object.prototype.toString().
Dlaczego warto podkreślać właściwość funkcji ?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
Więc Arary, Function, Objectsą wszystkie funkcje. Muszę przyznać, że to odświeża moje wrażenie na JS. Wiem, że funkcje są pierwszorzędnym obywatelem w JS, ale wydaje się, że jest on zbudowany na funkcjach.
Jaka jest różnica między __proto__i prototype?
__proto__referencja działa na każdym obiekcie i odnosi się do jego [[Prototype]]właściwości.
prototypeto obiekt tworzony automatycznie jako specjalna właściwość funkcji , która służy do przechowywania właściwości (w tym metod) obiektu funkcji.
Dzięki tym dwóm moglibyśmy mentalnie zmapować łańcuch prototypów. Jak to zdjęcie ilustruje:

function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__różniconstructor.prototype?