为什么不能设置使用“绑定”创建的函数的“原型”?

时间:2019-02-23 14:08:04

标签: javascript prototype

考虑以下代码:

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 :(得分:17)

  

据我了解,每个函数都有一个原型对象。

好吧,每个规则都有例外:-)您发现了一个:绑定函数没有.prototype属性,因为它们不需要它。当您使用new调用绑定函数时,它会使用原始对象的.prototype对象作为新实例的原型,将原始函数称为构造函数。

实际上,由于ECMAScript 6,许多函数没有对象的.prototype属性,因为它们不是构造函数-无法用new调用,因此它们不需要它。其中有

  • 箭头功能(() => {…}
  • 方法(对象文字和类中的method() { … }
  • 内置的非构造函数(如Math.sin

答案 1 :(得分:4)

请参见specification

  

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

     

[...]

     

注意1使用Function.prototype.bind创建的功能对象是奇异对象。它们也没有prototype属性。

答案 2 :(得分:3)

.bind()返回的函数没有原型对象。您可以给它一个:

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

“每个函数都有一个原型对象”并不是事实。每个函数都可以具有原型对象,但是“ prototype”属性的值可以是任何值,包括nullundefined

此外,有些“特殊”功能在所有情况下的行为可能都不像普通功能。

答案 3 :(得分:2)

将属性添加到prototype意味着您想通过将该函数用作构造函数来创建对象。

当您通过在函数上调用new来创建对象时,this值就是正在创建的新对象。因此,bind this设置为另一个值没有任何意义。