Он назначается в качестве прототипа объектов, созданных с помощью этой функции с помощью ключевого слова new
.
Так, например:
function Foo() {
}
Foo.prototype.bar = 47;
var obj = new Foo();
alert(obj.bar); // alerts 47, via `obj`'s prototype
Ссылка между obj
иобъект, назначенный на Foo.prototype
, является живым, и поэтому добавление дополнительных вещей к Foo.prototype
сделает их обнаруженными на прототипе obj
:
Foo.prototype.charlie = 62;
alert(obj.charlie); // alerts 62
Естественно, если вы замените Foo.prototype
(что я не одобряю), тогда вы указываете Foo.prototype
на другой объект.obj
по-прежнему будет ссылаться на старый:
Foo.prototype = {delta: 77}; // Not recommended
alert(obj.delta); // alerts "undefined"
Пример бесплатного использования
Относительно __proto__
: __proto__
не является стандартным.До ECMAScript5 (которому всего полтора года) существовал нет стандартный способ прямого взаимодействия с прототипом объекта, вы могли назначать их только во время создания объекта,и только косвенно через свойство prototype
функции конструктора.__proto__
является проприетарным расширением в некоторых движках JavaScript (особенно в SpiderMonkey от Mozilla, движке в Firefox).Это не в каком-либо стандарте, и согласно комитету ECMAScript, это не будет.(Вместо этого ECMAScript5 предоставляет функций для взаимодействия с прототипом объекта.) __proto__
теперь не поддерживается в Mozilla.