JavaScript对象方法链接:有用吗?

时间:2009-03-02 18:48:42

标签: javascript object method-chaining

所以...在JavaScript中乱搞一个对我来说很新的想法,让Object的方法返回它们是方法的Object;这导致了可链接性。我的问题是:这怎么有用?我把它扔在一起测试基本的工作:

<script>
MathChain = function()
 {
    this.pass = function()
     {
        this.multiply = eval(arguments.join('*'));
        this.add = eval(arguments.join('+'));
        return this;
     }
 }

m = new MathChain().pass(5, 10, 20).multiply; // 1000
a = new MathChain().pass(5, 10, 20).add;      // 35
</script>

这显然不是一个恶意高效的实例,人们会使用这个概念,所以你能指出我做的事情吗(除了jQuery,请)?

9 个答案:

答案 0 :(得分:25)

嗯,这是一个不太现实的例子,但我想你会明白这个想法。如果允许您对对象执行许多不同的操作,并提供方便。

var truck = function() {

    this.turnLeft = function {

       // turn left
       return this;

    }

    this.turnRight = function {

       // turn right
       return this;

    }

    this.goReallyFast = function {

       // go fast!
       return this;

    }

};

// My get-away plan
var myTruck = new truck();
myTruck.turnLeft().turnRight().goReallyFast();

答案 1 :(得分:8)

Fluent界面 - http://en.wikipedia.org/wiki/Fluent_interface

是的,我认为它可能非常有用,但任何设计模式都应该只在需要时使用

编辑:这是c#中的twitter客户端api,使用流畅的界面 - http://code.google.com/p/tweetsharp/

答案 2 :(得分:8)

对于一个非常不同的(非OO)示例,链接有点类似于Unix pipelines。 Unix管道的每一步都返回完整(修改)的内容,适合发送到下一步:

cat file1 file2 | sort -n | awk '{print $2}' | sed 's/@/ at /g'

答案 3 :(得分:6)

一个有用的示例是您的问题略有不同 - 您可以将对象设计为 immutable ,而不是返回相同的对象。然后你的函数将返回一个相同类型的新实例,但属性已经适当设置。

这有许多实际应用,特别是在函数式编程领域。

答案 4 :(得分:3)

虽然它不能像你的例子一样工作(TBH我以前从未见过这样做过),jquery considers "chaining" to be very useful和jquery现在几乎是JS的标尺网络框架...所以是的: - )

答案 5 :(得分:3)

我在找到这个问题的同时,在定义方法的同时寻找使方法可链接的一般解决方案。这就是我想出来的。我是一名JavaScript初学者;买家要小心。

makeChainable = function() {
    var receiver = arguments[0]
    for (var i = 1; i < arguments.length; i++) {
        functionName = arguments[i];
        (function() {
            wrapped = receiver[functionName];
            receiver[functionName] = function() {
                wrapped.apply(receiver, arguments);
                return receiver;
            }
        })();
    }
}

daisy = {
    name: 'Daisy',
    moo:  function() { console.log(this.name + " moos!") }
}

makeChainable(daisy, 'moo');
daisy.moo().moo().moo();

答案 6 :(得分:1)

在JavaScript中,这在导航DOM时始终出现。特别是当你试图通过一堆没有id的元素时。

例如,有关finding the first element of a table的SO问题。它可能涉及许多循环或链式命令。

答案 7 :(得分:0)

如果要在单个对象上执行一系列操作,JavaScript链接可能非常有用。我同意下面的Michael Luton,链接应该小心处理。如果将一个或两个链式方法添加到仍可读的对象上。如果您开始添加四个,五个甚至九个,那么您的代码将变得更难以阅读而不是维护。

答案 8 :(得分:-1)

所有的孩子都喜欢链接。但是,根据我的经验,它应该小心使用,因为它会降低代码的可读性。换句话说,做一些对你有意义的事情,并且对其他基本熟悉这个概念的程序员来说很容易理解。