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ą null
w 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
?
prototype
to 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
, prototype
jest ona automatycznie tworzona jako specjalna właściwość a
i zapisuje kod funkcji jako constructor
włą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
, Object
są 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.
prototype
to 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
?