如何在javascript中添加语法糖(或者应该)

如何在javascript中添加语法糖(或者应该),javascript,coding-style,Javascript,Coding Style,因此,我开始构建一个简单的库,它可以将视口中的屏幕交换为全屏web应用程序 我创建了一个基本界面来支持这一点: function Swap(element_in, element_out, animation_in, animation_out) 当我完成时,我想,嘿,这是javascript——我想知道我是否可以创建一些疯狂的语法,读起来像一个句子。我的目标是: Swap(element_in).InBy(animation_in).AndSwap(element_out).OutBy(an

因此,我开始构建一个简单的库,它可以将视口中的屏幕交换为全屏web应用程序

我创建了一个基本界面来支持这一点:

function Swap(element_in, element_out, animation_in, animation_out)
当我完成时,我想,嘿,这是javascript——我想知道我是否可以创建一些疯狂的语法,读起来像一个句子。我的目标是:

Swap(element_in).InBy(animation_in).AndSwap(element_out).OutBy(animation_out)
i、 e

在阅读了一些文章之后,我在这里找到了一篇文章,我现在似乎找不到这篇文章,这篇文章允许我用一些陷阱来实现这一点,也就是说,你可以按任何顺序调用这些方法,你必须存储一些变量。此界面如下所示:

function Swap2(element_in) {
  var _element_in, _element_out, _animation_in, _animation_out;

  // assign param
  _element_in = element_in;

  this.InBy = function(animation_in) {
    _animation_in = animation_in;
    return this;
  }

  this.AndSwap = function(element_out) {
    _element_out = element_out;
    return this;
  }

  this.OutBy = function(animation_out) {
    _animation_out = animation_out;

    // Do the swap!
    return Swap(_element_in, _element_out, _animation_in, _animation_out);
  }

  return this;
}
在这之后,我觉得很酷,但我打赌我可以做得更好。我想出了一个办法,尽量不要呕吐:

function Swap3(element_in) {
  return {
        InBy: function (animation_in) {
            return {
                AndSwap: function (element_out) {
                    return {
                        OutBy: function (animation_out) {
                            return Swap(element_in, element_out, animation_in, animation_out);
                        }
                    };
                }
            };
        }
    };
}
最后一个命令强制按正确的顺序调用方法,并且不保留任何参数——它只是传递它们

我制作了一个代码笔,这样你就可以看到它的实际效果,尽管我只在Chrome上玩过这个:

所以,我的问题是:我会为此下地狱吗?这是好事吗?还是一件非常糟糕的事情?还是只是偏好

安德鲁

我会为此下地狱吗

不,你会因为资本化非构造函数而陷入JavaScript地狱

无论如何,你的实现都是有效的,但是考虑使用更标准的东西:

swap(element_in, {
    inBy: animation_in,
    andSwap: element_out,
    outBy: animation_out
});

我想我看不出有什么价值。它看起来像一个英语句子,当然,但这有多重要?有更多的字符要输入,有更多的数据要发送给客户端,我怀疑这会缩小得很好。如果可以为每个步骤执行不同的操作,我可以看到它更有益,但我不知道我更喜欢它,而不是以相同的顺序执行四个步骤的普通函数调用。这段代码,加上你所拥有的金字塔地狱,肯定很难读懂

否则,这种方法在技术上没有问题

================== 编辑

要避免金字塔,可以执行以下操作。这还可以让您控制在每个步骤中可以执行以下哪些步骤

function Swap3(element_in) {
    var _element_in, _element_out, _animation_in, _animation_out;

    _element_in = element_in;

    return {
        inBy: inBy
    };


    function inBy(animation_in) {
        _animation_in = animation_in;

        return {
            andSwap: andSwap
        };
    }

    function andSwap(element_out) {
        _element_out = element_out;

        return {
            outBy: outBy
        };
    }

    function outBy(animation_out) {
        _animation_out = animation_out

        return Swap(_element_in, _element_out, _animation_in, _animation_out);
    }

}

你的基本界面是远远没有打字写和机器搅动使用。。。为什么不使用对象在一次调用中不获取VAR和任何订单?是的,我可以。然而,我的目标是明确的句子式语法。我只是想知道JS社区是如何看待这些看起来很可怕的代码来生成一个类似API的句子的;你到底是如何使用它的?@AndrewLeith:从对象获取属性?或者用作函数名?是的,地狱金字塔有点麻烦。下一步是能够在不同的时间执行不同的步骤,这取决于您在UI代码中何时知道哪个屏幕进出,然后通过另一个调用启动动画。
function Swap3(element_in) {
    var _element_in, _element_out, _animation_in, _animation_out;

    _element_in = element_in;

    return {
        inBy: inBy
    };


    function inBy(animation_in) {
        _animation_in = animation_in;

        return {
            andSwap: andSwap
        };
    }

    function andSwap(element_out) {
        _element_out = element_out;

        return {
            outBy: outBy
        };
    }

    function outBy(animation_out) {
        _animation_out = animation_out

        return Swap(_element_in, _element_out, _animation_in, _animation_out);
    }

}