2016-12-27 84 views
4

1)调用JavaScript调用链构造为对象

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接力,我发现了一个例子约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)'this'是什么?食物对象? Product.call(new Food, name, price);

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

产品仍然是一个函数,所以结果成为一个对象?

+0

'this'将指向'Food' – Rajesh

+0

其真正混淆,因为食品是一个构造函数,我们创建了一个新的食品对象,里面含有叫 –

+0

我越来越混淆这些,我们有函数,方法和Constructor,什么是类的功能? –

回答

4

两个产品食品用作构造函数,这意味着什么比它们的功能,它们可以用new被称为(但不一定要)多。 食品构造函数使用产品扩展用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(),这是第一个参数的上下文 - this产品函数执行期间的对象。

请注意,在这种情况下,.call返回undefined,因为该函数未用new调用,所以返回值将是函数返回值的任何明确返回值。由于产品中没有return声明,因此它将返回undefined。但是这里没有兴趣,因为我们只看到函数调用对第一个参数的副作用:this获取分配给它的属性。

所以产品食品功能都得到属性添加到相同对象。当食品new Food()返回时,您将有一个对象,即instanceof食品

注意,有来实现继承几种方法,做的这种方式它有一些缺点,包括:其是

  • 生成的对象不被视为instanceof产品
  • 性质在Product.prototype上定义的对象将不可用于使用new Food()创建的对象。
+0

从第一个示例中,var add是一个函数,但是第二个示例var Product不是一个函数,如何使用'call'? 'call'应该是function.call(object) –

+0

Product是一个函数。无论你编写'function Product(){...'或'var Product = function(){...',它都是一个函数。即使它没有明确地返回一个值,当你用'new'调用它时也是如此。而使用Product.call则不使用返回值,而是使用第一个参数(上下文)的副作用是重要的。 – trincot

+0

我们称为新食品,但我们不叫新产品,1。如果我们称新产品,产品将是对象(我们不能把obj.call(obj)),2.如果它的功能,新食品('feta ',5);应该不是对象,那是什么使我迷惑 –