Javascript调用对象的链构造函数

时间:2016-12-27 09:31:50

标签: javascript

1)致电

var obj = {num:2};

var add = function(a){
    return this.num + a;
};

add.call(obj, 1); //function.call(obj, arg)

2)调用链构造函数来获取对象。

var Product = function (name, price) {
    this.name = name;
    this.price = price;
}

var Food = function(name, price) {
    Product.call(this, name, price); // <-- 1. Product is obj constructor not fun
                                     //     2. what is 'this' here?
    this.category = 'food';
}

var cheese = new Food('feta', 5);

console.dir(cheese);

我目前正在学习javascript oop,我找到了一个关于Function.prototype.call()链构造函数的示例,但我不明白它是如何工作的。

1)是否调用所需的函数调用obj?但产品是构造的。

var food = { category : 'food' };

var Product = function (name, price) {
    this.name = name;
    this.price = price;
}

var cheese = Product.call(food);
console.dir(cheese);//this will become undefine

2)这是什么&#39;?食物? Product.call(new Food, name, price);

*最终结果var cheese将是一个对象Product.call(new Food obj, name, price)

产品仍然是一个功能,为什么结果成为一个对象?

1 个答案:

答案 0 :(得分:6)

Product Food 都被用作构造函数,这仅仅意味着它们是函数,并且可以使用new调用它们(但不要#39; t必须要)。 Food 构造函数使用 Product 来扩展使用new Food(...)创建的对象。

了解当您使用new调用函数时,必须创建一个新的空对象,该对象可用作this的该函数。然后,您可以在该功能中添加属性。此外,如果一个函数中没有return语句,它在使用new调用时仍将返回一个对象:它是在this内被调用的构造对象功能

一些魔法发生在:

Product.call(this, name, price); // <-- 1. Product is construct not fun

通常你会像这样打电话给产品

new Product(name, price)

...但是会创建并返回一个新对象。但是,此处的目的是扩展使用new Food(...)创建的对象。后一个对象是this。因此,不是执行new Product(...)(创建另一个新对象),而是将已存在的对象(this)传递给它。您可以使用.call(),它期望作为上下文的第一个参数 - 在 Product 函数执行期间将成为this的对象。

请注意,在这种情况下.call会返回undefined,因为函数不会使用new调用,因此返回值将是函数显式返回的值。由于产品中没有return语句,它将返回undefined。但是这里没有兴趣,因为我们只关注函数调用对第一个参数的副作用:this获取分配给它的属性。

因此 Product Food 函数都可以为相同的对象添加属性。当 Food new Food()来电回复时,您将拥有一个instanceof 食物的对象。

请注意,有几种方法可以实现继承,这种做法有一些缺点,包括:

  • 结果对象不被视为instanceof 产品
  • Product.prototype上定义的属性将无法用于使用new Food()创建的对象。