search

Home  >  Q&A  >  body text

javascript - js:哪种方式更好?

我包装了一个方法,需要传入一些参数(比较多,有二十个左右,但不是每个都必须的),我的想法是包装一下传入,包装函数:

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);
}

或者有更好的方案?

PHP中文网PHP中文网2816 days ago457

reply all(3)I'll reply

  • 高洛峰

    高洛峰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'
    }  
    */
    

    reply
    0
  • 迷茫

    迷茫2017-04-10 13:13:44

    你的两个方案,第二个那种会比较好一点。
    第一个的this没有其他东西的话……不是全局变量(大概是window?)吗……

    -

    js下应该没有更舒服的做法了吧 = ?我不是很确定
    coffee的话可以写的很舒服,编译出来也差不多吧。。

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 13:13:44

    你可以试试最近Github上风头正劲的 http://autographer.github.io/args.js/

    reply
    0
  • Cancelreply