Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;“切换对象”;使用闭包的组合_Javascript_Ecmascript 5 - Fatal编程技术网

Javascript &引用;“切换对象”;使用闭包的组合

Javascript &引用;“切换对象”;使用闭包的组合,javascript,ecmascript-5,Javascript,Ecmascript 5,我网站上的很多对象都有非常相似的行为。它们都需要“切换”,如打开和关闭 我使用的是toggle()方法,它根据boolisOpen调用open()或close()方法,但似乎我只能传入一个回调(在此模式中) 如何在每次切换方法调用时传入不同的回调 我是否应该将toggle()方法移出Openable 我甚至应该有一个toggle()方法吗 我的“可打开”行为对象: // Openable Behaviour var Openable = function Openable() { var

我网站上的很多对象都有非常相似的行为。它们都需要“切换”,如打开和关闭

我使用的是
toggle()
方法,它根据bool
isOpen
调用
open()
close()
方法,但似乎我只能传入一个回调(在此模式中)

  • 如何在每次切换方法调用时传入不同的回调
  • 我是否应该将
    toggle()
    方法移出
    Openable
  • 我甚至应该有一个
    toggle()
    方法吗

  • 我的“可打开”行为对象:

    // Openable Behaviour
    var Openable = function Openable() {
      var isOpen = false;
    
      // Open
      function open(callback) {
        isOpen = true;
        callback && callback();
      }
    
      // Close
      function close(callback) {
        isOpen = false;
        callback && callback();
      }
    
      // Toggle
      function toggle(callback) {
        isOpen ? close(callback) : open(callback);
      }
    
      return {
        get isOpen() {
          return isOpen;
        },
        open: open,
        close: close,
        toggle: toggle
      };
    };
    
    我的另一个具有可打开行为的对象:

    var Other = function Other(element) {
      var openable = Openable();
    
      element.addEventListener('click', function(event) {
        event.preventDefault();
        openable.toggle(/* what goes here? */);
      });
    
      function openCallback() {
        console.log("open!");
      }
    
      function closeCallback() {
        console.log("closed!");
      }
    
      return {
        target: element
      };
    };
    
    var myToggleObject = Other(myElement);
    


    注意:-我正在使用(我想),因为它允许我创建一个对象,而无需使用
    您可以创建一个
    切换回调
    方法来执行以下操作:

    function toggleCallback() { 
      openable.isOpen() ? openCallback() : closeCallback();
    };
    
    并将其传递给单击侦听器中的toggle方法

  • 如何在每次切换方法调用时传入不同的回调
  • 您可以向一个函数传递多个回调,因此

      function toggle(callback) {
        isOpen ? close(callback) : open(callback);
      }
    
    变成:

      function toggle(openCallback, closeCallback) {
        isOpen ? close(closeCallback) : open(openCallback);
      }
    
  • 我应该将toggle()方法移出Openable吗
  • 取决于代码的组织。我认为,只要函数是“可打开”的,就可以了

  • 我甚至应该有一个toggle()方法吗

  • 这取决于你的代码。我可以看出它对用户界面很有用。

    这是一种
    Openable
    Other
    的方法吗?在
    Other
    中,这样您就可以保留“每个操作一次回调”。对。。。我懂了。我试图使用
    toggle()
    来使用
    open()
    close()
    。这很好,因为它使
    对象更通用。它确实使
    可打开
    切换
    方法变得多余。尽管如此。在
    Openable
    之外使用
    isOpen()
    之后,您不妨编写:
    Openable.isOpen()?openable.close(closeCallback):openable.open(openCallback)
    谢谢。我有点希望单击处理程序不需要匿名函数,但它似乎是最合适的。记住,请解释下票数。。。