考虑此代码:
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 都有一个原型对象,但是"原型"属性的值可以是任何事物,包括null
或undefined
。
此外,在所有情况下,都有"特殊"功能可能不像普通功能。
将属性添加到 prototype
表示您想通过将函数用作构造函数来创建对象。
当您通过在函数上调用new
这样的对象时,this
值是要创建的新对象。因此,bind
this
对另一个值没有意义。