Почему я не могу установить "прототип" функции, созданной с помощью "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 с другим значением.