Search code examples
asp-classicvbscriptfluent-interfacejscriptmethod-chaining

Calling JScript functions from VBScript - Parentheses


I'm trying to bring some sanity to a legacy Classic ASP application, and as part of this I'm trying to write a Fluent API for some JScript classes that I have created.

e.g. myClass().doSomething().doSomethingElse()

The concept is outlined here (in VBScript)

This is my sample JScript class:

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();
}

In the existing VBScript code I'm then trying to chain the methods together:

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()

When the functions have more than one parameter I get the "Cannot use parentheses when calling a Sub" VBScript error. Strangely, it seems to work when followed by another method.

I understand that parentheses should be ommitted when calling a sub. However:

1. Why is it being recognised as a Sub if there is a return value?

2. Is there any way around this in order to implement my Fluent API?


Solution

  • You can put call at the start of each line of vbscript. This will accept brackets being put on each method call, e.g.

    ' This works
    call o.doSomething("b").doSomethingElse("c", "d")
    
    ' This works too
    call o.doSomething("e").doSomethingElse("f", "g").print()
    

    Or just don't put the parantheses in the vbscript when it complains...

    See Differences between VBScript and JavaScript