为什么我们必须通过"这个" foo.call中的参数(this,param1,param2)?

时间:2016-04-23 12:15:50

标签: javascript function object methods

据我所知,我们使用foo.call()来链接对象的构造函数。例如。以下内容:

function Product(name, price) {
  this.name = name;
  this.price = price;
}
function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}

function Toy(name, price) {
  Product.call(this, name, price);
  this.category = 'toy';
}

var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);

我们可以直接将call()代码插入:

,而不是使用Product方法。
function Food(name, price) {
        this.name = name;
        this.price = price;
        this.category = 'food';
    }

    function Toy(name, price) {
        this.name = name;
        this.price = price;
        this.category = 'toy';
    }

    var cheese = new Food('feta', 5);
    var fun = new Toy('robot', 40);

据我所知,foo()执行该函数。因此,如果我们直接将函数调用为Product.call(this, name, price);,那么代替Product(name , price),那么这必须等同于写this.name = name; this.price = price;

  • 那么为什么不添加Product(name , price)直接将name分配给this.name,即cheese.namefun.name

如果出于某种原因我们必须使用调用方法,那么为什么我们将this参数传递给call方法?为什么我们不使用Product.call(name, price)

1 个答案:

答案 0 :(得分:0)

在Javascript中,函数在特定上下文中执行。根据函数的调用方式(有四种方式),this被赋予一定的值。

一种方法是调用独立功能。在非严格模式下,如果您从Product(name, price)正文中拨打Foodthis会分配global(或window)对象的值。 name的值将分配给全局变量name等,而不是this方法中正在构造的Food对象。

在严格模式下,如果您执行与上述相同的操作,则会为this分配值nullundefined,因此您将收到错误。

另一种方法是使用原始方法call调用函数,这允许我们通过将this对象作为第一个参数传递给call来为其提供正确的值。方法

如果我们不使用call,则this将不会引用正确的对象。