Я изучаю прототип из Вы не знаете JS: этот & Прототипы объектов , замечательная книга, чтобы понять дизайн под ним и прояснить так много заблуждений (вот почему я пытаюсьизбегать использования наследования и тому подобных 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