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



考虑此代码:

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

据我了解,每个功能都有一个原型对象。

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

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

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

请参阅规范:

function.prototype.bind(thisarg,... args)

[...]

注释1使用Function.prototype.bind创建的函数对象是外来对象。他们也没有prototype属性。

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

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

"每个函数都有一个原型对象"并非如此。每个函数 can 都有一个原型对象,但是"原型"属性的值可以是任何事物,包括nullundefined

此外,在所有情况下,都有"特殊"功能可能不像普通功能。

将属性添加到 prototype表示您想通过将函数用作构造函数来创建对象。

当您通过在函数上调用new这样的对象时,this值是要创建的新对象。因此,bind this对另一个值没有意义。

最新更新