2013-07-13 67 views
0

所以我相當新的JavaScript和我一直在尋找方式來創建屬性與getter和setter(類似於C#屬性)。屬性的此JavaScript實現是否有效?

我想出了這個功能,但我不完全確定是否我錯過了一些可能會出錯的東西。這是創建屬性的有效方法嗎?

var property = function(instance, propname, acc) 
{ 
    acc = acc || {}; 
    acc.get = acc.get || function(val){ return val; }; 
    acc.set = acc.set || function(set){ return set; }; 
    var val = acc.val === undefined ? {} : acc.set(acc.val); 

    instance[propname] = {}; 
    instance[propname].get = function() { return acc.get(val); }; 
    instance[propname].set = function(set) { val = acc.set(set); }; 
} 

用法:

var obj = {}; 
property(obj, 'prop1'); 
obj.prop1.get(); // returns Object {} 
obj.prop1.set(13); 
obj.prop1.get(); // returns 13 

property(obj, 'prop2', 
     { 
      val : 13, 
      set : function(val) { return Math.min(val, 10); } 
     }); 
obj.prop2.get(); // returns 10 
obj.prop2.set(122); 
obj.prop2.get(); // returns 10 
obj.prop2.set(3); 
obj.prop2.get(); // returns 3 

property(obj, 'percent', 
     { 
      val : 100, 
      get : function(val) { return (val * 100).toFixed(2); }, 
      set : function(val) { return (Math.min(Math.max(val, 0), 100)/100.0); }, 
     }); 
obj.percent.get(); //returns "100.00" 
obj.percent.set(33.12543); 
obj.percent.get(); //returns "33.13" 
obj.percent.set(122.12); 
obj.percent.get(); //returns "100.00" 
obj.percent.set(-122.12); 
obj.percent.get(); //returns "0.00" 

回答

0

我還在讀通過,但我可以告訴你,這是錯誤的

var val = acc.set(acc.val) || {}; 

如果acc.setundefined它會拋出你需要檢查它是一個錯誤請在嘗試像這樣使用前設定

var val = acc.set && acc.set(acc.val) || {}; 
+0

難道你的意思是,如果acc.val是未定義的?你是對的,我錯過了錯誤檢查。我沒有嘗試定義一個沒有定義val的set方法。我會更新這個問題。 – Alex

相關問題