Мне довелось изучать прототип из You Not 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она автоматически создается как специальное свойство on aи сохраняет код функции как constructoron 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?