在从对象调用其他方法时,默认情况下执行javascript'方法'

时间:2011-03-20 02:54:29

标签: javascript dry

我已经读过在javascript中不使用太多全局变量是一个好习惯,所以我试图在一个变量中打包一些与我的应用程序导航按钮相关的函数,如下所示:

var navs = {
  projects:   function(){
    main.removeClass().addClass('showing_projects');
    //... other code
  },
  line_items: function(){
    main.removeClass().addClass('showing_line_items');
    //... other code
  },
  media:      function(){
    main.removeClass().addClass('showing_media');
    //... other code
  }
}

这样我才能做到

navs.projects()

显示项目。我的问题是,我有这个函数showNotify(),我需要在调用任何navs.projects(),navs.line_items()或navs.media()之后运行。我觉得将这个showNotify()行添加到这三个属性/方法中的每一个都不是DRY。有没有一种方法可以让我每次调用这三种方法时都能运行showNotify()?

谢谢

2 个答案:

答案 0 :(得分:0)

在每种方法的末尾添加showNotify()并不违反DRY。违反DRY将复制/粘贴showNotify()的内容而不是调用它。

据我所知,除了添加调用以实现目标之外,没有比简洁更简洁的方法了。即使有,这样做也是一个非常糟糕的主意,因为调用函数会对阅读代码的人看不到任何效果。

答案 1 :(得分:0)

您可以参数化每个不同函数的部分:

var navs = {
    addClassAndNotify: function(className, fn) {
        main.removeClass().addClass(className);
        fn();
        showNotify();

    }
}

并像这样使用:

navs.addClassAndNotify('showing_media', function() {
    // showing media code
});

您也可以创建一个函数生成器,如下所示:

function create(className, fn) {
    return function() {
        main.removeClass().addClass(className);
        fn();
        showNotify();
    }
}

然后创建这样的函数:

var navs = {
    projects: create(function(){
        //... other code
    }),
    line_items: create(function(){
        //... other code
    }),
    media: create(function(){
        //... other code
    }),
}

但我不认为在每个函数中调用showNotify是一件大事。