2011-12-03 47 views
0

我前幾天寫了兩個類,我需要重寫並調用重寫的方法(getQuery)。JavaScript層次結構,爲什麼父變量未定義?

//parent 
function SimpleUser() { 
    this.firstName = "X"; 
} 

SimpleUser.prototype.getQuery = function(sub) { 
    //solution for not getting undefined variables 
    var that = sub || this; 
    var query = "first="+that.firstName; 
    return query; 
} 

//child 
function User() { 
    //extends 
    this.base = SimpleUser; 
    //super() 
    this.base(); 

    //prints "X" 
    console.log(this.firstName); 

    this.lastName = "Y"; 
} 

//override 
User.prototype.getQuery = function() { 
    //call parent 
    var query = SimpleUser.prototype.getQuery.call(this); 
    query += "&last="+this.lastName; 
    return query; 
} 

//prints "first=X" 
console.log(new SimpleUser().getQuery()); 

//prints "first=undefined&last=Y" if I don't use parameter "sub" 
console.log(new User().getQuery()); 

當我從子類調用方法「getQuery」時,父類中的所有變量都是未定義的。如果我從子類的構造函數中調用它們,它們就很好。

我通過傳遞子類作爲參數解決了這個問題,並且只是檢查誰在問。

有人可以向我解釋爲什麼會發生這種情況,並幫助我找到一個更好的解決方案,而不是將子類本身作爲參數傳遞給我?

謝謝!

+0

它似乎工作,也沒有'sub':http://jsfiddle.net/qqeV3/。 – pimvdb

+0

爲什麼你不用'var User = new SimpleUser();' – StuperUser

+1

奇怪。我不明白爲什麼它不應該工作(儘管你使用罕見的習慣做繼承,超級構造函數調用通常是'SimpleUser.call(this)'沒有'base',你也錯過了'User.prototype = Object.create SimpleUser.prototype)',因爲鏈式原型是正常的,但它們都不應該是你的功能問題)。 – 2011-12-03 16:25:41

回答

0

Javascript沒有課程。它只有對象。並且對象從它們的原型繼承而來,而原型繼承自它們的原型等等。如果你想了解更多關於在JavaScript中繼承的內容,請看http://phrogz.net/js/classes/OOPinJS2.html。雖然這是可行的,但如果你想在JavaScript中模仿類和類繼承,我推薦使用爲此設計的框架,比如MooTools。

+2

但是,張貼的代碼實際上工作正常。 – Pointy