Для чего используется свойство prototype функции JS? - PullRequest
2 голосов
/ 06 июня 2011

Я понимаю наследование прототипа javascript через свойство __proto__.Однако я заметил, что когда я это сделаю, var f = function() {} f теперь будет иметь свойство prototype в дополнение к свойству __proto__.Казалось бы, prototype не участвует в цепочке собственности.Что именно делает это делает?

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

свойство _proto_ является свойством экземпляра объекта (в данном случае это функция), оно ссылается на прототип экземпляра.Следует отметить, что это свойство нестандартное и не рекомендуется к использованию, вместо него используйте Object.getPrototypeOf(ref): https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto

prototype, напротив, является свойством объявления функции (не экземпляра) и являетсяпрототип для всех экземпляров функции.Ознакомьтесь с документами: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/prototype

Когда вы создаете новый экземпляр функции (используя ключевое слово new), создается объект функции, как определено prototype.После его создания (var myNewObject = new Foo()) вызов Object.getPrototypeOf(myNewObject) вернет ссылку на прототип, на котором основан экземпляр.

Подводя итог: __proto__ - это то, что что-то ЕСТЬ, prototype - это то, что МОЖЕТ БЫТЬ (или уже может быть).

4 голосов
/ 06 июня 2011

Он назначается в качестве прототипа объектов, созданных с помощью этой функции с помощью ключевого слова 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.

...