我前幾天寫了兩個類,我需要重寫並調用重寫的方法(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」時,父類中的所有變量都是未定義的。如果我從子類的構造函數中調用它們,它們就很好。
我通過傳遞子類作爲參數解決了這個問題,並且只是檢查誰在問。
有人可以向我解釋爲什麼會發生這種情況,並幫助我找到一個更好的解決方案,而不是將子類本身作爲參數傳遞給我?
謝謝!
它似乎工作,也沒有'sub':http://jsfiddle.net/qqeV3/。 – pimvdb
爲什麼你不用'var User = new SimpleUser();' – StuperUser
奇怪。我不明白爲什麼它不應該工作(儘管你使用罕見的習慣做繼承,超級構造函數調用通常是'SimpleUser.call(this)'沒有'base',你也錯過了'User.prototype = Object.create SimpleUser.prototype)',因爲鏈式原型是正常的,但它們都不應該是你的功能問題)。 – 2011-12-03 16:25:41