【问题标题】:How to use Chaining with Nested, Revealing Module Patterns in JavaScript?如何在 JavaScript 中使用带有嵌套、显示模块模式的链接?
【发布时间】:2016-06-29 10:29:56
【问题描述】:

我正在努力理解几种结合在一起的 JS 模式:显示模块模式链接模式

理想情况下,我希望能够从一个初始化函数调用多个方法,如下所示:

components
    .loader()
    .menu()
    .toolbar();

只要我公开定义的任何方法return this;,这都能完美运行。

但是当我需要嵌套显示模块模式以公开在初始化之外调用的更深层次的方法时,事情开始出错了,如下所示:

components
    .menu
        .close();

这样做的问题是menu 不再返回components,而是返回它的子方法,这意味着它在这一点上打破了链条。这是一个“完整”的示例来说明我要实现的目标:

var components = function () {

    var loader = function () {
        console.log("components.loader initialisation");

        return this;
    }

    var menu = function () {
        console.log("components.menu initialisation");

        var open = function () {
            console.log("components.menu.open");

            return this;
        }
        var close = function () {
            console.log("components.menu.close");

            return this;
        }

        return {
            open: open,
            close: close
        }
    }();

    var toolbar = function () {
        console.log("components.toolbar initialisation");

        return this;
    }

    return {
        loader: loader,
        menu: menu(),
        toolbar: toolbar
    }
}();

$(function () {

    components
        .loader()
        .menu()
        .toolbar();

    components
        .menu
            .open();

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

所以我想我的问题是,我该如何使用;嵌套、显示模块并链接在一起(如果可能的话)?

【问题讨论】:

  • 首先,您希望菜单是什么?组件或模块的方法。两者(尽管可能)都有点模棱两可。
  • 所以澄清一下,您希望 components.menu 返回 components(连同 openclose 方法)和 components.menu.close() 也返回 components 或只是 @987654334 @返回components?也许更新帖子以包含一些查询的预期输出会有所帮助。
  • 抱歉,我将添加一些进一步的示例以进行澄清。
  • @Thomas 我需要菜单来设置菜单内的代码,因此它具有打开和关闭等事件。但我需要允许其他函数调用打开和关闭,以便可能触发工具栏项例如打开或关闭菜单。这有意义吗?

标签: javascript jquery chaining method-chaining revealing-module-pattern


【解决方案1】:

var components = (function () {

var loader = function () {
    console.log("components.loader initialisation");

    return this;
};

var menu = function () {

    var menu = function () {
        console.log("components.menu initialisation");
		
        return this;
    };
	

    menu.open = function () {
        console.log("components.menu.open");

        return this;
    };

    menu.close = function () {
        console.log("components.menu.close");

        return this;
    };

    return menu;
};

var toolbar = function () {
    console.log("components.toolbar initialisation");
	
    return this;
};

return {
    loader: loader,
    menu: menu(),
    toolbar: toolbar
};
})();

$(function () {
components
	.loader()
	.menu()
	.toolbar();

components
	.menu
		.open();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • 太好了,谢谢!你介意解释一下为什么这对 RMP 有效吗?为什么菜单既可以作为函数.menu() 也可以作为对象.menu
  • 在Javascript中函数也是一个对象。每个对象都可以包含自己的属性。所以内部变量menu是一个函数(可以用作menu()),这个内部菜单有属性close和open(可以用作menu.close())。
猜你喜欢
  • 2018-02-26
  • 2021-05-26
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
相关资源
最近更新 更多