2016-04-23 75 views
0

據我所知,我們使用foo.call()來鏈接對象的構造函數。例如。以下內容:爲什麼我們必須在foo.call(this,param1,param2)中傳遞「this」參數?

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)直接分配給namethis.name,即cheese.namefun.name

如果由於某種原因我們不得不使用呼叫方法,那麼爲什麼我們通過this參數來調用方法?爲什麼我們不使用Product.call(name, price)

+0

因爲['this''關鍵字](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)是如何工作的(在'Product'函數中) – Bergi

+0

@Bergi在'Product'裏面指的是什麼'this'? – user31782

+0

沒有,如果你把它叫做Product(name,price)'。當你稱之爲「Product.call(this,name,price)」時,你通過'call'傳入的'this' - 即作爲新玩具或食物的'this'。 – Bergi

回答

0

在Javascript中,函數在特定的上下文中執行。根據函數的調用方式(有四種方式),this被賦予一定的值。

一種方法是調用獨立功能。在非嚴格模式下,如果您從Food正文中調用Product(name, price),則會爲this分配值global(或window)對象。將name的值分配給全局變量name等,而不是this對象正在構建的Food方法中。

在嚴格模式下,如果您的操作與上面相同,則this分配的值爲nullundefined,因此您將收到錯誤消息。

的另一種方法是調用使用原始的方法call,它允許我們通過將其作爲第一個參數到call方法以提供用於this對象正確的值的函數。

如果我們不使用call,this將不會引用正確的對象。

+0

我猜'只有當它是一個範圍內的'this'才被賦予正確的值。在'function('my_name'){this.name = my_name}'中可以工作,但在'function('my_name'){Product(my_name){this.name = my_name}}'This'' can not look two以上範圍。 – user31782

相關問題