Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';设置';原型&x27;使用';绑定';?_Javascript_Prototype - Fatal编程技术网

Javascript 为什么可以';设置';原型&x27;使用';绑定';?

Javascript 为什么可以';设置';原型&x27;使用';绑定';?,javascript,prototype,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

考虑以下代码:

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

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

bar.prototype = { newprop: "new" };
并非“每个函数都有一个原型对象”。每个函数都可以有一个prototype对象,但“prototype”属性的值可以是任何值,包括
null
未定义的

此外,有些“特殊”函数在所有情况下都可能与普通函数不同。

请参阅:

Function.prototype.bind(thisArg,…args) [……]

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

据我所知,每个函数都有一个原型对象

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

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

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

原型添加属性意味着您希望使用函数作为构造函数来创建对象


当您通过调用函数上的
new
来创建一个对象时,
this
值就是正在创建的新对象。因此,将此
绑定到另一个值是没有意义的。

通过向该函数添加原型属性,您想做什么?@Pointy只是试图理解原型和绑定。您能告诉我们,什么时候使用绑定方法而不是调用和应用。@Bearniti呃,它们做完全不同的事情吗?