鉴于不同浏览器对属性描述符的支持并不统一, KISSY 模拟实现了属性描述符, 提供属性的获取和设置操作, 即属性的 getter 和 setter 动作.

Methods

addAttr void addAttr( name, attrConfig )

给宿主对象增加一个属性.

Parameters:
name <String> 属性名.
attrConfig <attrConfig> 属性配置信息, 支持下面的配置项:
{
    value: 'the default value',     // 属性默认值
    valueFn: function               // 提供属性默认值的函数
    setter: function                // 写属性
    getter: function                // 读属性
}

如果配置项中没有设置 value, 会调用 valueFn 函数获取默认值并赋给 value.

addAttrs void addAttrs( attrConfigs, values )

批量添加属性.

Parameters:
attrConfigs <Object> 属性名/配置信息对.
values <values> 属性名/值对, 该值为属性的默认值, 会覆盖配置信息中的默认值.

hasAttr void hasAttr( name )

判断是否有名为 name 的属性.

removeAttr void removeAttr( name )

删除名为 name 的属性.

set void set( name, value )

设置属性 name 的值为 value.

get void get( name )

获取属性 name 的值.

当没有设置属性值时, 会取该属性的默认值.

reset void reset( name )

重置属性 name 为初始值. 如果不给出属性名, 默认将所有属性名全部重置为初始值.

重置属性值, 同样会触发 "beforeAttrNameChange" 和 "afterAttrNameChange" 事件.

Events

beforeAttrNameChange

名为 "attrName" 的属性, 在改变它的值之前触发该事件.

afterAttrNameChange

名为 "attrName" 的属性, 在改变它的值之后触发该事件.

示例


KISSY.ready(function(S) {
    // 自定义类
    function myClass() {
    }

    // 让你的类支持属性描述符
    S.augment(myClass, S.Attribute);

    var cls = new myClass();

    // 增加属性
    cls.addAttr('size', {
        value: 0,
        setter: function(v) {
            if (S.isString(v) && v.indexOf('inch')!== -1) {
                return parseFloat(v)*10/3;
            }
            return parseFloat(v);
        },
        getter: function(v) {
            return v;
        }
    });
    // 绑定事件
    cls.on('afterSizeChange', function(ev){
        console.log('change '+ ev.attrName + ': '+ev.prevVal+' --> '+ev.newVal);
    });

    // 设置属性
    cls.set('size', 20);

    // 获取属性
    alert(cls.get('size'));

    // 重置
    cls.reset();
    alert(cls.get('size'));
});

如果你想让类默认就支持 attribute 功能, 请直接继承 S.Base .