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

时间:2013-02-22 00:59:26

标签: javascript function prototype

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

function1.call(function2.prototype);

我花了太多时间试图理解上面的代码。任何人都可以解释上述案例中function1function2的变化情况吗?

functional mixins

我可以在function1的对象上调用function2中的方法。所以,我的结论是function必须改变。

2 个答案:

答案 0 :(得分:5)

根据您的代码示例,this调用中function1的值将设置为function2.prototype对象的值。

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


function1.call(function2.prototype);

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

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

this

然后方法内的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 的值将是实际的原型对象。这将是一个不寻常的用途。


链接中的代码示例似乎是这样的:

asCircle

在此示例中,this函数将方法添加到作为其Circle.prototype值提供的任何内容中。所以基本上,.area()正在通过此调用使用其他方法进行增强。

正如您所看到的,Circle方法在通过该调用分配后的{{1}}原型链中可用。

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

答案 1 :(得分:2)

他们不是。你的代码使用function2的原型作为上下文来调用function1。所以在调用中,“this”将映射到function2的原型,而不是window对象(假设你是从浏览器调用它)