Здесь есть две разные, но связанные сущности, которые требуют объяснения:
.prototype
функций. [[Prototype]]
[1] sup> sup> всех объектов [2] sup> sup>. Это две разные вещи.
[[Prototype]]
: Это свойство существует для всех объектов [2] sup> sup>.
Здесь хранится еще один объект, который, как сам объект, имеет свое собственное [[Prototype]]
, которое указывает на другой объект. Этот другой объект имеет [[Prototype]]
своих собственных. Эта история продолжается до тех пор, пока вы не достигнете прототипа объекта, который предоставляет методы, доступные для всех объектов (например, .toString
).
Свойство [[Prototype]]
является частью того, что образует цепочку [[Prototype]]
. Эта цепочка объектов [[Prototype]]
проверяется, например, когда над объектом выполняются операции [[Get]]
или [[Set]]
:
var obj = {}
obj.a // [[Get]] consults prototype chain
obj.b = 20 // [[Set]] consults prototype chain
.prototype
: Это свойство встречается только в функциях. Используя очень простую функцию:
function Bar(){};
Свойство .prototype
содержит объект , который будет присвоен b.[[Prototype]]
, когда вы сделаете var b = new Bar
. Вы можете легко проверить это:
// Both assign Bar.prototype to b1/b2[[Prototype]]
var b = new Bar;
// Object.getPrototypeOf grabs the objects [[Prototype]]
console.log(Object.getPrototypeOf(b) === Bar.prototype) // true
Одним из наиболее важных .prototype
является то, что функции Object
. Этот прототип содержит прототипный объект, содержащийся во всех цепочках [[Prototype]]
. На нем определены все доступные методы для новых объектов:
// Get properties that are defined on this object
console.log(Object.getOwnPropertyDescriptors(Object.prototype))
Теперь, поскольку .prototype
является объектом, он обладает свойством [[Prototype]]
. Когда вы не делаете никаких назначений для Function.prototype
, .prototype
[[Prototype]]
указывает на прототипный объект (Object.prototype
). Это автоматически выполняется каждый раз, когда вы создаете новую функцию.
Таким образом, каждый раз, когда вы делаете new Bar;
цепочку прототипов, вы получаете все, что определено в Bar.prototype
, и все, что определено в Object.prototype
:
var b = new Bar;
// Get all Bar.prototype properties
console.log(b.__proto__ === Bar.prototype)
// Get all Object.prototype properties
console.log(b.__proto__.__proto__ === Object.prototype)
Когда вы делаете присваиваете Function.prototype
все, что вы делаете, это расширяете цепочку прототипов для включения другого объекта. Это как вставка в односвязный список.
Это в основном изменяет цепочку [[Prototype]]
, позволяя свойствам, которые определены для объекта, назначенного Function.prototype
, быть видимым любым объектом, созданным функцией.
[1: Это никого не смущает; доступно через свойство __proto__
во многих реализациях. sup>
[2]: Все, кроме null
. sup >
Временная структура - это то, что, я думаю, вы ищете.
Также я могу рекомендовать книгу Filthy Rich Clients , если вы ее пишете богатые приложения.
Альтернативой является также jgoodies: Библиотека анимации