18

所以......在 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,请)?

4

9 回答 9

25

好吧,这是一个不太现实的适用示例,但我想你会明白的。If 允许你对一个对象做许多不同的操作,并且提供了方便。

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();
于 2009-03-02T18:57:03.437 回答
8

流畅的界面 - http://en.wikipedia.org/wiki/Fluent_interface

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

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

于 2009-03-02T19:00:02.417 回答
8

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

cat file1 file2 | sort -n | awk '{print $2}' | sed 's/@/ at /g'
于 2009-03-02T19:05:36.553 回答
6

一个有用的示例是对您的问题稍作改动——您不是返回相同的对象,而是将对象设计为不可变的。然后,您的函数将全部返回相同类型的新实例,但属性已正确设置。

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

于 2009-03-02T19:06:52.527 回答
3

虽然它的工作方式与您的示例不同(TBH,我以前从未见过这样做过),但jquery 认为“链接”非常有用,而 jquery 几乎是这些天的衡量标准JS web 框架......所以是的:-)

于 2009-03-02T19:42:08.523 回答
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();
于 2013-04-03T20:39:52.223 回答
1

在 JavaScript 中,这在导航 DOM 时总是会出现。尤其是在尝试通过一堆没有 ID 的元素时。

例如,关于查找 table 的第一个元素的问题。它可能涉及很多循环或链式命令。

于 2009-03-02T19:16:34.607 回答
0

如果您想对单个对象执行一系列操作,JavaScript 链接可能非常有用。我同意下面的 Michael Luton 的观点,应该小心处理链接。如果您将一两个链式方法添加到仍然可读的对象上。如果您开始添加 4 个、5 个甚至 9 个,那么您的代码不仅难以阅读,而且难以维护。

于 2009-07-08T18:35:46.243 回答
-2

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

于 2009-04-08T00:37:10.100 回答