Почему я не могу установить "прототип" функции, созданной с помощью "bind"?
Рассмотрим этот код:
function foo(something) {
this.a = something;
}
var obj1 = {};
var bar = foo.bind(obj1);
Теперь следующее утверждение не выполняется:
bar.prototype.newprop = "new"; // Cannot execute this
Как я понял, каждая функция имеет прототип объекта. Тогда почему мы не можем выполнить вышеуказанное утверждение?
И бар действительно является функцией, как мы можем ее назвать:
bar(2);
console.log(obj1.a); // 2
Ответы
Ответ 1
Как я понял, каждая функция имеет прототип объекта.
Ну, есть исключения из каждого правила :-) Вы нашли одно: связанные функции не имеют свойства .prototype
потому что им это не нужно. Когда вы вызываете связанную функцию с помощью new
, она вызывает исходную функцию в качестве конструктора, используя исходный объект .prototype
в качестве прототипа нового экземпляра.
Фактически, поскольку в ECMAScript 6 многие функции не имеют свойства .prototype
с объектом, потому что они не являются конструкторами - их нельзя вызывать с new
поэтому им это не нужно. Среди них
- функции стрелок (
() => {…}
) - методы (
method() { … }
в объектных литералах и классах) - встроенные неконструктивные функции (например,
Math.sin
)
Ответ 2
Смотрите спецификацию:
Function.prototype.bind(thisArg,... args)
[...]
ПРИМЕЧАНИЕ 1. Объекты функций, созданные с использованием Function.prototype.bind
являются экзотическими объектами. Они также не имеют свойства prototype
.
Ответ 3
.bind()
функция из .bind()
не имеет объекта-прототипа. Вы можете дать ему один:
bar.prototype = { newprop: "new" };
Это неправда, что "каждая функция имеет объект-прототип". Каждая функция может иметь объект-прототип, но значением свойства "prototype" может быть что угодно, включая null
или undefined
.
Кроме того, существуют "специальные" функции, которые могут не вести себя как обычные функции во всех случаях.
Ответ 4
Добавление свойств в prototype
означает, что вы хотите создать объект, используя функцию в качестве конструктора.
Когда вы создаете объект, например, вызывая new
для функции, значением this
является создаваемый новый объект. Так что нет смысла bind
this
с другим значением.