Почему я не могу установить «прототип» функции, созданной с помощью «bind»? - PullRequest
0 голосов
/ 23 февраля 2019

Рассмотрим этот код:

function foo(something) {
  this.a = something;
}

var obj1 = {};

var bar = foo.bind(obj1);

Теперь следующий оператор не выполняется:

bar.prototype.newprop = "new"; // Cannot execute this

Как я понял, каждая функция имеет объект-прототип.Тогда почему мы не можем выполнить вышеприведенный оператор?

И bar действительно является функцией, которую мы можем вызвать:

bar(2);
console.log(obj1.a); // 2

Ответы [ 4 ]

0 голосов
/ 23 февраля 2019

Добавление свойств к prototype означает, что вы хотите создать объект, используя функцию в качестве конструктора.

Когда вы создаете объект, например, вызывая new для функции, thisзначение - это новый создаваемый объект.Так что нет смысла bind this к другому значению.

0 голосов
/ 23 февраля 2019

См. спецификацию :

Function.prototype.bind (thisArg, ... args)

[...]

ПРИМЕЧАНИЕ 1 Функциональные объекты, созданные с помощью Function.prototype.bind, являются экзотическими объектами.Они также не имеют свойства prototype.

0 голосов
/ 23 февраля 2019

Как я понял, у каждой функции есть объект-прототип.

Ну, есть исключения из каждого правила :-) Вы нашли одно: связанные функции не имеют .prototype собственность, потому что им это не нужно.Когда вы вызываете связанную функцию с помощью new, она вызывает исходную функцию в качестве конструктора, используя объект .prototype оригинала в качестве прототипа нового экземпляра.

Фактически, так как во многих функциях ECMAScript 6 не используетсяУ него нет свойства .prototype с объектом, потому что они не являются конструкторами - их нельзя вызвать с помощью new, поэтому им это не нужно.Среди них есть

  • функции стрелок (() => {…})
  • методы (method() { … } в объектных литералах и классах)
  • встроенные неконструктивные функции (например, Math.sin)
0 голосов
/ 23 февраля 2019

Возвращенная функция из .bind() не имеет объекта-прототипа.Вы можете дать ему одно:

bar.prototype = { newprop: "new" };

Это неправда, что «каждая функция имеет объект-прототип».Каждая функция может иметь объект-прототип, но значение свойства "prototype" может быть любым, включая null или undefined.

Кроме того, существуют "специальные" функцииэто может не вести себя как обычные функции во всех случаях.

...