改进JS的“类”框架?

时间:2013-11-03 22:28:53

标签: javascript

请不要辩论这种方法是否有效,有些人这样做,有些则没有。

这是我的超小班级框架。请注意,通过简单地返回任何/ undefined我使它完全私有静态(是的,它有用)。或者我可以归还所有内容并将其完全公开化。

非常简单,约4行代码。现在更复杂的部分 - 见下文。

config_module确定它是什么类型的klass。

实现:

$P.klass = function (obj, config_module) {

    // all properties are private ( there is no access )

    if (!config_module) {
        return undefined;
    }

    // all properties are public and static ( there is no instance )

    if (config_module === true) {
        return obj;
    }

    // constructor based, all properties are public and static/instance

    if (config_module === 'constructor') {
        var object_public;
        if (obj.constructor) {
            object_public = obj.constructor;
            delete obj.constructor;
        }
        $A.someKey(obj, function (val, key) {
            object_public.prototype[key] = val;
        });
        return object_public;
    }
};

如果我想让它基于实例而不是静态,我只需要找到一个恰当命名的构造函数属性,然后将其返回,然后将其余属性放在原型链上。

这很好用,我甚至可以使用this使用实例变量,如下所示

    var SForm = $A.klass({

        Name: 'SForm',

        // static based

        S: {
            google:    'https://plus.google.com/_/favicon?domain=',
            pre_url:   /(http:)|(https:)\/\//,
            domain:    /:\/\/(www\.)?([\.a-zA-Z0-9\-]+)/

            // ... blah

        },
        constructor : function (form_elements) {
            this.form_obj = {};
            $A.someKey(form_elements, function (val) {
                if (val.type !== 'checkbox') {
                    this.form_obj[val.name] = val.value;
                } else if (val.type === 'checkbox') {
                    this.form_obj[val.name] = val.checked;
                }
            }, this);
        },
        get: function (key) {
            return this.form_obj[key];
        },
        set: function (key, value) {
            this.form_obj[key] = value;
        },
        getObj: function () {
            return this.form_obj;

        // ... blah

    }, 'constructor');

现在问题:

有没有办法明确列出实例变量。而不是在构造函数中设置它们,我可以将它们放在框架中吗?

0 个答案:

没有答案