我最近一直在使用javascript進行原型實驗,我無法弄清楚爲什麼下面的代碼不起作用。我想要做的是用參數n創建一個新的奶酪實例。將參數傳遞給javascript中的原型函數
function food(n) {
this.n=n;
}
function cheese(n) {
alert(this.n);
}
cheese.prototype=new food;
new cheese('paramesian');
我最近一直在使用javascript進行原型實驗,我無法弄清楚爲什麼下面的代碼不起作用。我想要做的是用參數n創建一個新的奶酪實例。將參數傳遞給javascript中的原型函數
function food(n) {
this.n=n;
}
function cheese(n) {
alert(this.n);
}
cheese.prototype=new food;
new cheese('paramesian');
您正在創建一個新的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'
編輯,這顯然不是典型的繼承(見註釋),但它似乎爲這個特定目的的工作。
function food(n) {
this.n=n;
}
function cheese(n) {
this.prototype = food;
this.prototype(n);
alert(this.n);
}
new cheese('paramesian');
爲什麼投票?這是一個非常有效的方法... – Atli 2009-11-29 01:14:43
你從我這裏得到了讚賞,因爲這不是原型繼承在JavaScriupt中的工作原理。你也可以說「this.anything = food; this.anything(n)',你仍然會得到正確的警報。但「奶酪」決不會通過該代碼進入原型鏈。 – 2009-11-29 01:44:36
我沒有downvoted你,但'原型'對象意味着用於**構造函數**而不是在對象實例(如'this'),你的例子工作,因爲當你調用'this.prototype(n );',你在新的「cheese」對象('this')的上下文中執行'food',就像我發佈的第一個示例一樣,嘗試更改'foobar'示例中的'prototype'關鍵字,看到它也可以工作,它與原型鏈無關...... – CMS 2009-11-29 01:47:15
好像你只是想了解原型鏈的作品在JavaScript中。以下是一個很好的,簡單的和很好的解釋教程 http://www.herongyang.com/JavaScript/Inheritance-from-Constructor-Prototype-Object.html
我喜歡#3,但是你必須刪除'食物(n)'前的'新'。 – Magnar 2009-11-29 00:51:29
@Magnar,是一個錯字,固定,沒有'this'或'new'使用... – CMS 2009-11-29 01:06:35
感謝您提供豐富的答案。選項1似乎是現在的最佳選擇,至少在完全理解#3之前。 – Kenneth 2009-11-29 01:13:20