2011-02-28 123 views
2

我試圖讓我的頭繞着使用「僞古典繼承」風格的JS繼承。我做了很多谷歌搜索,並閱讀了經典文章。我熟悉Java的類結構,並試圖理解JS的原型風格。我正在尋找香草JS,因爲我想先了解基礎知識。JavaScript繼承範圍問題

我有一個簡單的父/子測試類的設置,需要一些幫助的範圍規則。

1.)我什麼時候在類中定義方法而不是類之外的方法?

2.)當我使用原型樣式創建方法時,如何訪問私有變量和私有函數?

function superClass(name){ 
    this.name = name; 
    var privateValue = "I'm Private"; 
    this.outputPrivate2 = function(){ 
    alert(privateValue); //works fine 
    }  
} 

superClass.prototype.outputPrivate = function(){ 
alert(this.privateValue); //outputs undefined.. 
    alert(superClass.prototype.privateValue) //also undefined 
} 

3.)子對象如何調用私有函數或訪問父類的私有變量?

4.)子對象何時應該手動調用父構造函數?

subClass2.prototype = new superClass();    // Define sub-class 
subClass2.prototype.constructor = subClass2; 

function subClass2(name) { 
this.name = name; 
this.Bye = function() { 
return "Bye from subClass - " + this.name; 
} 
this.testm = function(){ 
superClass.prototype.SomeParentMethod.call(this, "arg1", "arg2"); 
} 

}

var parent = new superClass("parent"); 
var child = new subClass("child1"); 
parent.outputPrivate(); //undefined 
parent.outputPrivate2(); //I'm private 
child.outputPrivate(); //undefined 
child.outputPrivate2(); //I'm private 

我不得不在代碼的80%被複制,所以我創建了一個父對象和三個子對象的三個對象。子對象具有使用和處理來自父項的私有數據的方法。我得到這個工作的唯一方法是使所有變量公開,我不喜歡。再一次,我對Java的熟悉程度,所以我可能會努力讓JS像Java一樣工作。

+0

一個構造函數的範圍內定義的變量和函數可以訪問的唯一方法是,如果他們是通過關閉訪問 – 2011-02-28 23:08:05

+0

你能提供一個我如何訪問「privateValue」的例子嗎?它不需要在構造函數中。我可以設置一個包含我需要的私有數據的初始化方法。基本上我有許多方法需要能夠共享的內部數據。 – David 2011-02-28 23:12:31

+0

抱歉的錯誤答案〜 – Shad 2011-02-28 23:17:51

回答

3

您正在解決一些有趣的面向對象JavaScript的問題。

1)在類中定義方法時,每次調用構造函數時都會創建一個新函數。如果使用大量對象,這可能會導致性能問題。當您將一個方法附加到原型對象時,該函數僅創建一次。

2)但是在構造函數中定義函數的好處是你可以使用「private」方法/屬性。在Javascript中,並沒有真正像私有變量那樣的東西。相反,你正在創建一個包含一些變量的閉包。

如果您需要在構造函數之外使用這些變量,則需要將它們公開。

3)同樣的問題。

4)雖然你的問題是不完全清楚,我會做這樣的事情:

function parent(){ 
    this.a = 1; 
} 

function child(){ 
    parent.call(this); 
    this.b = 2; 
} 

obj = new child(); 
// now obj.a == 1, obj.b == 2