在JS中创建对象的最佳做法是什么:T('isArray')([])== T.run('isArray')([])== T()。run('isArray') ?

时间:2011-08-18 10:52:13

标签: javascript

在这样的JavaScript中创建对象的最佳做法是什么,知道T是主要对象:

  T('isArray')([])
  T.run('isArray')([])
  T().run('isArray')([])

  T('isArray', [])
  T.run('isArray', [])
  T().run('isArray', [])

他们都必须使用相同的功能。

1 个答案:

答案 0 :(得分:1)

由于可以调用主对象,因此它必须是一个函数。该函数应根据参数决定返回的内容:

var T = (function() {

    var functions = { // define functions that can be run like isArray
        isArray: function(a) {
            return Array.isArray(a);
        },

        log: function(a, b) {
            console.log(a + b);
        }
    };

    var noop = function() {}; // function doing nothing (no operation)

    var T = function(f) {
        if(arguments.length >= 2) { // function + args provided
            return (functions[f] || noop) // call it
                    .apply(this, [].slice.call(arguments, 1));
        } else if(arguments.length === 1) { // only function provided
            return function() { // return function that can be called with args
                return (functions[f] || noop)
                        .apply(this, arguments);
            }
        } else { // nothing provided, return T itself (so that e.g. T.run === T().run)
            return T;
        }
    }

    T.run = function() { // run function
        return T.apply(this, arguments);
    };

    T.getState = function() { // another function
        console.log("Not implemented");
    };

    return T; // actually return T so that it gets stored in 'var T'
})();


// tests

console.log(
    T('isArray')([]),
    T.run('isArray')([]),
    T().run('isArray')([]),

    T('isArray', []),
    T.run('isArray', []),
    T().run('isArray', [])
);

T('log')(1, 2);
T.getState();