/** * @ignore * attribute management and event in one * @author yiminghe@gmail.com, lifesinger@gmail.com */ KISSY.add('base', function (S, Attribute, Event) { /** * @class KISSY.Base * @mixins KISSY.Event.Target * @mixins KISSY.Base.Attribute * * A base class which objects requiring attributes and custom event support can * extend. attributes configured * through the static {@link KISSY.Base#static-ATTRS} property for each class * in the hierarchy will be initialized by Base. */ function Base(config) { var self = this, c = self.constructor; // save user config self.userConfig = config; // define while (c) { addAttrs(self, c['ATTRS']); c = c.superclass ? c.superclass.constructor : null; } // initial initAttrs(self, config); } /** * The default set of attributes which will be available for instances of this class, and * their configuration * * By default if the value is an object literal or an array it will be 'shallow' cloned, to * protect the default value. * * for example: * @example * { * x:{ * value: // default value * valueFn: // default function to get value * getter: // getter function * setter: // setter function * } * } * * @property ATTRS * @member KISSY.Base * @static * @type {Object} */ function addAttrs(host, attrs) { if (attrs) { for (var attr in attrs) { // 子类上的 ATTRS 配置优先 // 父类后加,父类不覆盖子类的相同设置 // 属性对象会 merge // a: {y: {getter: fn}}, b: {y: {value: 3}} // b extends a // => // b {y: {value: 3, getter: fn}} host.addAttr(attr, attrs[attr], false); } } } function initAttrs(host, config) { if (config) { for (var attr in config) { // 用户设置会调用 setter/validator 的,但不会触发属性变化事件 host.setInternal(attr, config[attr]); } } } S.augment(Base, Event.Target, Attribute); Base.Attribute = Attribute; S.Base = Base; return Base; }, { requires: ['base/attribute', 'event/custom'] });