0

所以我对javascript相当陌生,我一直在寻找使用getter和setter创建属性的方法(类似于C#属性)。

我想出了这个功能,但我不完全确定我是否遗漏了一些可能出错的东西。这是创建属性的有效方法吗?

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"
4

1 回答 1

0

我还在通读,但我可以告诉你这是错误的

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

如果acc.setundefined会抛出一个错误,您需要在尝试像这样使用它之前检查它是否已设置

var val =  acc.set && acc.set(acc.val) || {}; 
于 2013-07-13T17:59:00.487 回答