考虑以下代码:
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
答案 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”属性的值可以是任何值,包括null
或undefined
。
此外,有些“特殊”功能在所有情况下的行为可能都不像普通功能。
答案 3 :(得分:2)
将属性添加到prototype
意味着您想通过将该函数用作构造函数来创建对象。
当您通过在函数上调用new
来创建对象时,this
值就是正在创建的新对象。因此,bind
this
设置为另一个值没有任何意义。