The source code

    /**
     * @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']
    });