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