2013-09-05 40 views
1

我已經通讀了大部分Javascript繼承引用,但是我仍然在撓撓我的腦海,以至於如何做到這一點。簡單的'靜態'在Javascript'基類'

我試圖把幾個,在一般意義上,將具有類似的行爲和想法使用原型可能是一種方法來實現這一點。所以,我創建了一個基類如下:

function my_base_class() 
{ 
    var a_common_object = undefined; // The true value of this can't be set until runtime. 

    // some other stuff ... 
}; 

理想情況下,我想a_common_object是私有的,或者至少保護,但剛開始它的工作將是一個良好的開端。然後我需要創建多個派生類其中,這可能是一個:

function my_derived_class() 
{ 
    this.do_something_to_common_object = function() 
    { 
     // Here I need to reference my_base_class.a_common_object but 
     // at this point there's no relationship between the two classes 
    }; 
}; 

我現在設置的my_derived_class原型,同時創建一個實例:在這一點上,我

my_derived_class.prototype = new my_base_class(); 
var my_derived_class_inst = new my_derived_class(); 

所以希望我有一個對象 - my_derived_class_inst其特點my_base_class包括我可以訪問的靜態對象a_common_object

我有兩個問題:

  1. 如何參考a_common_object時 沒有關係的兩個類之間建立內my_derived_class
  2. 然後,我怎樣才能將a_common_object更改爲其真實值,以便所有派生類無縫地獲取新值。

請不要簡單地把我介紹給繼承的標準參考網站,因爲我已經閱讀了大多數的網站,我仍然不明智。在我看來,答案應該非常簡單,但到目前爲止,它逃脫了我。非常感謝。

回答

2

do_something_to_common_object()真的沒有辦法直接到達a_common_object

a_common_object不是成員prototype創建的實例。它是構造函數中的一個局部變量。因此,只有這也是在構造函數中定義的function可以達到它(參考:closures):

function my_base_class() 
{ 
    var a_common_object = undefined; 

    Object.defineProperty(this, 'a_common_object', { 
     get: function() { 
      return a_common_object; 
     } 
    }); 

    // ... 
} 
function my_derived_class() 
{ 
    this.do_something_to_common_object = function() 
    { 
     console.log(this.a_common_object); // uses getter to retrieve the value 
    }; 
}; 

它仍然是公開訪問,但JavaScript並沒有你的選擇是有限的支持或具有訪問修飾符的等價物。

雖然,與Object.defineProperty(),它至少是目前只讀,默認情況下不可枚舉(不會出現在for..in循環)。

至少要到#2,在那裏你還需要一個setter。雖然,這將是一個驗證存儲值的機會。

Object.defineProperty(this, 'a_common_object', { 
    // .... 

    set: function (value) { 
     if (/* validator */) { 
      a_common_object = value; 
     } 
    } 
}); 
+0

作品一種享受!非常感謝! –