请不要辩论这种方法是否有效,有些人这样做,有些则没有。
这是我的超小班级框架。请注意,通过简单地返回任何/ 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');
现在问题:
有没有办法明确列出实例变量。而不是在构造函数中设置它们,我可以将它们放在框架中吗?