У мене трапляється вчитися прототипу від You Don't Know JS: this & Object Prototypes , яка є чудовою книгою, щоб зрозуміти дизайн під ним і уточнити стільки помилок (саме тому я намагаюся уникати використання спадщини та подібних речей instanceof
).
Але у мене те саме питання, що тут задавали люди. Кілька відповідей справді корисні та освічуючі. Я також хотів би поділитися своїми розуміннями.
Що таке прототип?
Об'єкти в JavaScript мають внутрішнє властивість, позначене в специфікації як [[Prototype]]
, яке є просто посиланням на інший об'єкт. Майже всі об’єкти мають null
цінність для цього властивості на момент їх створення.
Як отримати прототип об’єкта?
через __proto__
абоObject.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
Що таке prototype
?
prototype
- об'єкт автоматично створюється як особлива властивість функції , яка використовується для встановлення ланцюга делегування (успадкування), також ланцюга прототипу.
Коли ми створюємо функцію a
, prototype
автоматично створюється як спеціальне властивість увімкнено, a
а код функції зберігається як constructor
включений prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
Я хотів би розглянути цю властивість як місце для зберігання властивостей (включаючи методи) об’єкта функції. Це також причина, чому функції утиліти в JS визначаються як Array.prototype.forEach()
,Function.prototype.bind()
,Object.prototype.toString().
Навіщо підкреслювати властивість функції ?
{}.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();
Так Arary
, Function
, Object
всі функції. Я повинен визнати, що це освіжає моє враження про JS. Я знаю, що функції є першокласним громадянином в JS, але здається, що він побудований на функціях.
Яка різниця між __proto__
і prototype
?
__proto__
посилання працює на кожен об’єкт для посилання на його [[Prototype]]
властивість.
prototype
- це об'єкт, автоматично створений як особлива властивість функції , який використовується для зберігання властивостей (включаючи методи) об’єкта функції.
З цими двома ми могли б подумки зіставити ланцюжок прототипу. Як показано на цьому малюнку:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
відрізняється відconstructor.prototype
?