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)
产品仍然是一个功能,为什么结果成为一个对象?
答案 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()
创建的对象。