这个JavaScript Function.call方法在做什么?

这个JavaScript Function.call方法在做什么?,javascript,function,prototype,Javascript,Function,Prototype,我花了太多时间试图理解上面的代码。有人能解释一下在上述情况下,function1和function2是如何变化的吗 我能够在function2的对象上调用function1中的方法。所以,我的结论是函数一定已经改变了。它们没有改变。您的代码正在使用function2的原型作为上下文调用function1。因此,在调用中,“this”将映射到function2的原型,而不是window对象(假设您是从浏览器调用它)给定您的代码示例,调用function1时this的值将设置为function2.

我花了太多时间试图理解上面的代码。有人能解释一下在上述情况下,
function1
function2
是如何变化的吗


我能够在
function2
的对象上调用
function1
中的方法。所以,我的结论是
函数
一定已经改变了。

它们没有改变。您的代码正在使用function2的原型作为上下文调用function1。因此,在调用中,“this”将映射到function2的原型,而不是window对象(假设您是从浏览器调用它)

给定您的代码示例,调用
function1
this
的值将设置为
function2.prototype
对象的值

var function1 = function(){};
var function2 = function(){};

function1.call(function2.prototype);
因此,
function2.prototype上的方法(或其他值)可以从
this
内部
function1
访问

但如果它们只是像这样被调用:

var function1 = function(){
    console.log(this === function2.prototype); // true
};
var function2 = function(){};


function1.call(function2.prototype);
然后方法中的
this
的值将是实际的原型对象。这将是一个不寻常的用途


链接中的代码示例如下所示:

this.someMethod();

在本例中,
asCircle
函数向作为其
this
值提供的任何内容添加方法。因此,基本上,
Circle.prototype
通过调用其他方法得到了增强

如您所见,
.area()
方法在通过该调用分配后,将在
循环的原型链中可用


因此,不是调用的函数正在使用这些方法,而是相反。。。它提供了新的方法。

你所说的“改变”是什么意思?重新编辑:不要期望人们关注随机链接。如果有实质性的东西,请在问题本身中引用。你似乎有更好的事情要做,我建议你继续做,让更友善的人花时间回答我的问题。但是,谢谢你的建议。沙格尹军:与其生气,不如把@T.J.Crowder的建议当作有用的信息。你的问题越全面,对你和其他人都越有利。链接很好,但应该被视为补充,最相关的信息直接放在问题中。有趣的是,我尝试将其与
SimpleJSInheritance
一起使用。由于某种原因,它不起作用。这可能是因为您在
this.someMethod()中提到的原因示例。但是,这可能是它自己的问题。再次感谢。@ShaggyInjun:不客气。是的,这种方法只是一种扩展方法。这些方法在调用时可能没有用处。坦率地说,使用
.call()
this
来达到这个目的似乎有点奇怪。我宁愿他们只接受
.prototype
作为常规参数。那样看起来就更清楚了。
var asCircle = function() {
  this.area = function() {
    return Math.PI * this.radius * this.radius;
  };
  this.grow = function() {
    this.radius++;
  };
  this.shrink = function() {
    this.radius--;
  };
  return this;
};

var Circle = function(radius) {
    this.radius = radius;
};
asCircle.call(Circle.prototype);

var circle1 = new Circle(5);
circle1.area(); //78.54