2015-11-11 93 views
1

我想創建一個數據對象類型的包裝。我希望能夠在其上時,改變有以下兩個方面的影響包裝定義屬性:你可以使用setter在屬性上添加其他屬性嗎?

  1. 改變了包裝的數據對應的屬性值對象
  2. 將單獨改變的記錄到目前爲止所有變化的列表

在最近了解到它的存在之後,好像JavaScript內置的getter和setter功能(特別是setter)是該工作的工具。這裏有一個問題:我試圖儘可能使其與現有的API大致相符,並且有問題的API字段不一定支持直接獲取值,而是查詢屬性以查看它是否符合某些條件。

因此,例如,也許我有一個car對象與財產car.color。我希望能夠通過只說car.color = "blue";來設置此屬性,但我也希望能夠調用函數car.color.isBlue();,該函數返回true,無論該屬性的值是「藍色」還是「藍色」或「#0000FF」或是任何我寧願包裝在一個函數中的案例數量,而不是直接與每次的值進行比較。

我當然可以很容易地通過指定一個明確的property.set(value)功能做到這一點,但在我看來,這樣是最好的,如果可能避免冗餘代碼:感覺比=分配不太自然,並刪除之間的(IMO)漂亮的語法區別修改屬性並查詢它。

這感覺就像JavaScript(作爲一般的精神事物)應該足夠靈活以支持,但我沒有試過的東西實際上已經工作。那麼,這實際上是可能的嗎?更主觀地說,如果答案是肯定的,是否有什麼令人信服的理由說明我爲什麼不應該這樣做?

回答

2

您可以讓getter返回具有isBlue函數的對象。

喜歡的東西

function ColoredThing(color){ 
    var colorValue = color; 
    var colorProperty = { isBlue: function(){ 
     return colorValue === "blue"; 
    }} 

    Object.defineProperty(this, "color",{ 
     get: function(){ 
      return colorProperty; 
     }, 
     set: function(color){ 
      //track history, whatever. 
      colorValue = color; 
     } 
    }); 
}; 

然後

var thing = new ColoredThing("blue"); 
    var color = thing.color 
    var isBlue = color.isBlue(); //isBlue == true 
    thing.color = "red"; 
    isBlue = color.isBlue(); //isBlue == false 
+0

哈,輝煌!不知道爲什麼沒有發生在我身上。現在唯一棘手的部分是確保我能夠正確確定範圍,因爲我將爲很多屬性填充非常類似的函數,並且我希望保持DRY ...儘管如此,還是一個不同的問題,我希望我能回答自己。乾杯! – endemic

相關問題