2013-01-17 13 views
1

我寫了一個簡單的JavaScript繼承原型,但我越來越問題..任何一個指導我正確的聲明?javascript原型 - 找到我的問題

代碼:

var Man = function(params){ 
    this.name = params.name, 
    this.age = params.age, 
    this.job = params.job; 
} 

Man.prototype.work = function(){ 
    return this.name +' is working as a ' + this.job; 
} 

var Women = function(params){ 
    this.name = params.name, 
    this.age = params.age, 
    this.job = params.job; 
} 

Women.prototype = new Man(); //assigning the prototype 

var man1 = new Man({name:'man1',age:'age1',job:'job1'}); 
console.log(man1.work()); //it works 

var woman1 = new Women({name:'woman1',age:'age2',job:'job2'}); 
console.log(woman1.work()); // it is not.. why? 

錯誤我得到:

TypeError: params is undefined 
[Break On This Error] 

this.name = params.name, 
+3

什麼樣的問題? –

+0

女人不想工作。人物。 – Cerbrus

+0

你有任何控制檯錯誤? –

回答

1

你不是從女人到男人傳遞你的參數,試試這個:

Women.prototype = new Man({name:this.name,age:this.age,job:this.job}); 

其實,這也可以工作:

Women.prototype = new Man(this); 

好處是它只有4個字母的額外代碼,並且這個應該可以在所有支持JS的瀏覽器上工作。

+0

有什麼需要通過參數2次? – 3gwebtrain

+0

「工作」是「人」原型中的一個功能。它不能「看到」傳遞給「婦女」的變量,你必須傳遞它。 – Cerbrus

+0

這似乎不正確。在這種情況下,「this」究竟是什麼? –

4

由於你在呼喚Man不帶任何參數收到此錯誤:

Women.prototype = new Man(); 

由於函數裏面,paramsundefined,訪問params.name將引發異常。

這就是爲什麼設置這樣的原型不方便的原因之一。您目前不想創建Man的新實例,您只需將其原型鏈接到原型鏈中。

更好地利用Object.create[MDN](包括填充工具)來創建一個對象具有特定原型:

Women.prototype = Object.create(Man.prototype); 
Women.prototype.constructor = Women; 

和內部Women,調用父類的構造(它並不意味着是一個骯髒的笑話)沿參數傳遞:

function Women(params) { 
    Man.call(this, params); 
} 
+1

只需注意瀏覽器對'create'方法的支持:** IE9 + **,FF4 + – MrWhite

+0

@ w3d:添加了一個鏈接到MDN文檔,其中有一個polyfill。 –