2009-11-29 82 views
5

我最近一直在使用javascript進行原型實驗,我無法弄清楚爲什麼下面的代碼不起作用。我想要做的是用參數n創建一個新的奶酪實例。將參數傳遞給javascript中的原型函數

function food(n) { 
    this.n=n; 
} 
function cheese(n) { 
    alert(this.n); 
} 
cheese.prototype=new food; 
new cheese('paramesian'); 

回答

8

您正在創建一個新的Cheese實例,論證n從未使用或分配給Cheese實例變量this.n,因爲邏輯是隻在Food構造函數中使用。

你可以做幾件事:

1。 ApplyFood構造函數在Cheese函數中,使用arguments對象和新創建的上下文(this)。

function Food(n) { 
    this.n=n; 
} 

function Cheese(n) { 
    Food.apply (this, arguments); 
    alert(this.n); 
} 

new Cheese('paramesian'); 

2。在Cheese構造函數重複Food構造邏輯(this.n = n):

function Food(n) { 
    this.n=n; 
} 

function Cheese(n) { 
    this.n = n; 
    alert(this.n); 
} 

Cheese.prototype = new Food(); 
new Cheese('paramesian'); 

3。使用另一種技術,像power constructors

function food (n) { 
    var instance = {}; 
    instance.n = n; 

    return instance; 
} 


function cheese (n) { 
    var instance = food(n); 
    alert(instance.n); 

    return instance; 
} 

cheese('parmesian'); 
cheese('gouda'); 

4。另一種選擇,prototypal inheritance

// helper function 
if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
    }; 
} 

var food = { 
    n: "base food", 
    showName : function() { alert(this.n); } 
}; 

var cheese1 = Object.create(food); 
cheese1.n = 'parmesian'; 
cheese1.showName(); // method exists only in 'food' 
+0

我喜歡#3,但是你必須刪除'食物(n)'前的'新'。 – Magnar 2009-11-29 00:51:29

+0

@Magnar,是一個錯字,固定,沒有'this'或'new'使用... – CMS 2009-11-29 01:06:35

+0

感謝您提供豐富的答案。選項1似乎是現在的最佳選擇,至少在完全理解#3之前。 – Kenneth 2009-11-29 01:13:20

-1

編輯,這顯然不是典型的繼承(見註釋),但它似乎爲這個特定目的的工作。

function food(n) { 
    this.n=n; 
} 
function cheese(n) { 
    this.prototype = food; 
    this.prototype(n); 

    alert(this.n); 
} 

new cheese('paramesian'); 
+0

爲什麼投票?這是一個非常有效的方法... – Atli 2009-11-29 01:14:43

+1

你從我這裏得到了讚賞,因爲這不是原型繼承在JavaScriupt中的工作原理。你也可以說「this.anything = food; this.anything(n)',你仍然會得到正確的警報。但「奶酪」決不會通過該代碼進入原型鏈。 – 2009-11-29 01:44:36

+0

我沒有downvoted你,但'原型'對象意味着用於**構造函數**而不是在對象實例(如'this'),你的例子工作,因爲當你調用'this.prototype(n );',你在新的「cheese」對象('this')的上下文中執行'food',就像我發佈的第一個示例一樣,嘗試更改'foobar'示例中的'prototype'關鍵字,看到它也可以工作,它與原型鏈無關...... – CMS 2009-11-29 01:47:15

相關問題