请不要争论这种方法是否有效,有些人这样做,有些人不这样做。
这是我的超小班框架。请注意,通过简单地返回任何内容/未定义,我使其完全私有静态(是的,这有一个用途)。或者我可以返回所有内容并使其完全公开。
很简单,大概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');
现在的问题:
有没有办法明确列出实例变量。除了将它们设置在构造函数中,我可以将它们以某种方式放在框架中吗?