2012-05-23 48 views
0

我一直在學習JavaScript中的類,原型的使用以及最終如何繼承。JavaScript中的原型和繼承無法正常工作,因爲我期望

從我的理解下面應該:

  1. 警報「約翰」由於myInstance.getIt();被稱爲
  2. 警報「傑克」由於myInheritedInstance.getIt();被稱爲
  3. myInheritedInstance.getParent(); MyClass中
  4. 已分配給 .getIt()
  5. 當myInheritedInstance.getParent();這應該提醒「約翰」。叫做。

而是實際發生的事情是:

  1. 警報 「約翰」
  2. 警報空白
  3. 警報 「傑克」

我有一種感覺,我已經做了一些愚蠢或者誤解了這裏的一個基本概念,所以任何幫助將不勝感激。

var MyClass = function() { }; 

MyClass.prototype.constructor = MyClass; 
MyClass.prototype.name = "John"; 
MyClass.prototype.getIt = function() { alert(this.name); }; 

var myInstance = new MyClass(); 
myInstance.getIt(); 

//Now inheritance 

var MyInheritedClass = function() { }; 
MyInheritedClass.prototype = new MyClass; 
MyInheritedClass.prototype.constructor = MyInheritedClass; 
MyInheritedClass.prototype.name = "Jack"; 
MyInheritedClass.prototype.getIt = function() { alert(this.name); }; 
MyInheritedClass.prototype.getItParent = MyClass.prototype.getIt.call(this); 

var myInheritedInstance = new MyInheritedClass(); 
myInheritedInstance.getIt(); 
myInheritedInstance.getItParent(); 

回答

3

罪魁禍首是:

MyInheritedClass.prototype.getItParent = MyClass.prototype.getIt.call(this); 

.call通話的功能,而不是回報之一。所以它會引起兩個問題:它會事先調用它,並返回一些不可調用的東西(在控制檯中出現錯誤)。你必須做的事:

MyInheritedClass.prototype.getItParent = function() { 
    alert(Object.getPrototypeOf(Object.getPrototypeOf(this)).name); 
}; 

的問題是,name不是通過this訪問了,因爲它已經被繼承類陰影了。要獲得原始類別的name,您必須沿着原型鏈走兩遍:inherited instance -> inherited prototype -> original prototype

MyClass.prototype.constructor = MyClass; 

是沒有必要在這裏,順便說一句。如果您覆蓋prototype,則需要恢復constructor,因爲constructor在這種情況下會丟失。所以在你的情況下,只需要繼承類。

此外,線

MyInheritedClass.prototype.getIt = function() { alert(this.name); }; 

是多餘的,它只是爲MyClass.prototype.getIt一樣 - 你繼承。

請注意,JavaScript沒有真正的「類」,儘管它們的行爲可以像這樣完成。

+0

感謝您的澄清。我認爲問題在於我從一個不太正確的教程開始工作。所以沒有辦法通過調用來獲取基類重寫的方法和值?你是否展示了唯一能夠「接觸」他們的例子? – Nealbo

+0

是的,我認爲在MyInheritedClass中添加getIt是我自己帶來的一些小小的「失禮」! – Nealbo