Maison > Questions et réponses > le corps du texte
我包装了一个方法,需要传入一些参数(比较多,有二十个左右,但不是每个都必须的),我的想法是包装一下传入,包装函数:
var conf = {
a: 'aaa',
b: 'bbb',
c: 'ccc'
}
初始化函数:
function init(obj, conf){
for (var p in conf) {
obj[p] = conf[p];
}
}
问题是,下面两种定义方式,哪一种比较好?
第一种:
function jamo(conf){
this.a= 'AAA';
this.b= 'BBB';
this.c= 'CCC';
init(this, conf);
}
第二种:
function jamo(conf){
var C = {
a: 'default value',
b: 'default value',
c: 'default value'
};
init(C, conf);
}
或者有更好的方案?
高洛峰2017-04-10 13:13:44
T_T,不懂怎么写sg的换行,双空格没用。
第一个,没有上下文,没有运行环境,普通模式无所谓的正确和错误,严格模式下出错。但是如果你这样用的话,jamo作为一个对象的话可读性就更好了。
如果直接调用 jamo(conf),按照第一种写法,window出现三个全局变量了。
下面是对象模式的写法,非最好的对象编写方法,更优写法可参阅coffeescript的写法。
function Jamo(conf){
this.a= 'AAA';
this.b= 'BBB';
this.c= 'CCC';
function init(obj, conf){
for (var p in conf) {
obj[p] = conf[p];
}
}
init(this, conf);
}
var conf = {
a: 'aaa',
b: 'bbb',
c: 'ccc'
}
var jamo = new Jamo(conf);
第二种的话,是一般对象的拓展方式,但是init方法需要返回值,修改为
function init(obj, conf){
for (var p in conf) {
obj[p] = conf[p];
}
return obj;
}
但是,基本上没什么用途,我猜测下你的想法:
设置一个参数 conf 对象,这个参数有默认的值,如果传递的参数的部分必须存在的字段不存在,就还原为默认值。看下面。
//默认配置信息
var conf = {
a: 'aaa',
b: 'bbb',
c: 'ccc'
}
function init(obj, conf){
// conf 为默认配置,obj为用户配置,obj中已配置项不应被覆盖。
for (var p in conf) {
obj[p] = obj[p] || conf[p];
}
return obj;
}
var conf1 = {
e: 'eee',
a: 'AAA',
}
conf1 = init(conf1,conf);
/*
结果为
conf1 = {
e: 'eee',
a: 'AAA',
b: 'bbb',
c: 'ccc'
}
*/
迷茫2017-04-10 13:13:44
你的两个方案,第二个那种会比较好一点。
第一个的this没有其他东西的话……不是全局变量(大概是window?)吗……
-
js下应该没有更舒服的做法了吧 = ?我不是很确定
coffee的话可以写的很舒服,编译出来也差不多吧。。