从VBScript调用JScript函数 - 圆括号

Bre*_*tin 0 vbscript fluent-interface method-chaining asp-classic jscript

我试图为传统的经典ASP应用程序带来一些理智,作为其中的一部分,我正在尝试为我创建的一些JScript类编写Fluent API.

例如 myClass().doSomething().doSomethingElse()

这里概述这个概念(在VBScript中)

这是我的示例JScript类:

var myClass = function () {
    this.value = '';
}

myClass.prototype = function () {

    var doSomething = function (a) {
        this.value += a;
        return this;
    },

    doSomethingElse = function (a, b) {
        this.value += (a + b);
        return this;
    },

    print = function () {
        Response.Write('Result is: ' + this.value + "<br/>");
    }

    return {
        doSomething: doSomething,
        doSomethingElse: doSomethingElse,
        print: print
    };

}();

/// Wrapper for VBScript consumption
function MyClass() {
    return new myClass();
}
Run Code Online (Sandbox Code Playgroud)

在现有的VBScript代码中,我正在尝试将这些方法链接在一起:

dim o : set o = MyClass()
'' This works
o.doSomething("a")

'' This doesn't work
o.doSomething("b").doSomethingElse("c", "d")

'' This for some reason works
o.doSomething("e").doSomethingElse("f", "g").print()
Run Code Online (Sandbox Code Playgroud)

当函数有多个参数时,我得到" Cannot use parentheses when calling a Sub"VBScript错误.奇怪的是,当它跟着另一种方法时似乎有效.

我知道在调用sub时应该省略括号.然而:

1.如果有返回值,为什么它被识别为Sub?

2.有什么方法可以实现我的Fluent API吗?

Ekk*_*ner 5

规则是:当将"命名的代码片段" 作为子句调用时,没有参数列表().令人讨厌的陷阱是:对于单个参数npcs,()可能看起来像param list(),但是(解释为)pass-me-by-value().

你的set o = MyClass()MyClass()作为一个函数调用; 从作业中可以清楚地看出来.

你的o.doSomething("a")调用.doSomething as sub,()被视为pass-me-per-value(); doSomething "a"这将是正确的电话.

你的o.doSomething("b").doSomethingElse("c", "d")作品的第一部分,因为o.doSomething("b").是/使用函数调用来获取一个.doSomethingElse()被调用的对象; 第二部分.doSomethingElse("c", "d")不能工作,因为它不是一个子调用(没有使用/赋值的返回值),并且()不能被视为pass-me-by-value().o.doSomething("b").doSomethingElse "c", "d"会是对的.

第一部分o.doSomething("e").doSomethingElse("f", "g").print()(直到.print)是一个函数调用(获取将.print的对象),所以()是param list(); .print之后的()是错误的,但编译器/解释器让它们溜走了.

总结一下:当你不想要某些东西时,不要使用().

WRT评论:

换句话说:当你想要回复时使用()!

set o1 = MyClass() < - 返回值应该进入o1

set o2 = o.S(1, 2).S(3, 4).S(5, 6)< - 下一次调用需要/使用前两个返回值; 最后一个返回值进入o2.

o.S(1, 2).S(3, 4).S 5, 6 < - 最后一个返回值被丢弃 - 没有子调用

()规则是关于你做什么的(使用或不使用返回值),而不是关于npc 什么.