0

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

这是我的超小班框架。请注意,通过简单地返回任何内容/未定义,我使其完全私有静态(是的,这有一个用途)。或者我可以返回所有内容并使其完全公开。

很简单,大概4行代码。现在更复杂的部分 - 见下文。

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

执行:

$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');

现在的问题:

有没有办法明确列出实例变量。除了将它们设置在构造函数中,我可以将它们以某种方式放在框架中吗?

4

0 回答 0