使用嵌套函数和默认函数定义函数

时间:2016-05-19 17:48:08

标签: javascript

请考虑以下代码:

function test() {
    this.foo = function() {
        console.log('foo');
        return;
    }

    this.bar = function() {
        console.log('bar');
        return;
    }
}

var action = new test();
action.foo();    //prints 'foo'

以上代码可以正常工作,以防我需要在操作foo内调用操作bartest。但是,动作test本身应该是一个可调用的函数。我认为如果JavaScript让我创建这样的东西(见下文)会很酷,但正如预期的那样:

  

TypeError:action不是函数

function test() {
    this.foo = function() {
        console.log('foo');
        return;
    }

    this.bar = function() {
        console.log('bar');
        return;
    }

    return function() {
        console.log('default');
        return;
    }();
}

var action= new test();
action();        //prints 'default'
action.bar();    //printf 'bar'

是否有可能实现类似的目标?

5 个答案:

答案 0 :(得分:4)

有可能。只需在里面创建一个函数并直接将其他属性添加到函数对象:

function test() {
  
    var result = function () {
        console.log('default');
    };
  
    result.foo = function() {
        console.log('foo');
        return;
    }

    result.bar = function() {
        console.log('bar');
        return;
    }

    return result;
}

var test = new test();
test();        //prints 'default'
test.bar();    //printf 'bar'

答案 1 :(得分:1)

在javascript中,也可以向函数添加属性。所以你可以做这样的事情:

function test() {
    function defaultFn() {
       console.log('default');
    }
    defaultFn.foo = function() {
        console.log('foo');
        return;
    }
    defaultFn.bar = function() {
        console.log('bar');
        return;
    }
    return defaultFn;
}

答案 2 :(得分:1)

虽然其他人指出这是可能的,但我只想指出,让构造函数返回一个不是由new创建的实例的对象通常是一种不好的做法。

看看你的例子:

function Test() {
    this.foo = function() {}

    this.bar = function() {}

    return function() {}();
}

var test = new Test();

(我将您的test函数重命名为Test,因为它是您希望使用new调用的大写函数的约定。

当你调用new Test()时,JS所做的是它创建一个新的Object实例{}并将其作为Test()上下文传递给this函数。默认情况下,此对象也是对new的调用返回的内容。

所以你正在做的是将foobar函数附加到新创建的对象isntance上。

然后你return一个不同的函数,然后从调用new Test()而不是其上有foobar的对象实例返回...该对象只是丢失/垃圾收集。

这“从构造函数返回一个不同的对象”是不好的做法,导致混乱。加上这种情况发生了:

function Test() {}

var test = new Test();
test instanceof Test; // returns TRUE

但是如果你还有别的东西:

function Test() {
  return function() {};
}

var test = new Test();
test instanceof Test; // returns FALSE (confusing!!!)

避免new并且只做:

会更清晰
function test() {
    var newFunc = function() {
        console.log('default');
        return;
    };

    newFunc.foo = function() {
        console.log('foo');
        return;
    }

    newFunc.bar = function() {
        console.log('bar');
        return;
    }

    return newFunc;
}

var t = test();
t();      // default
t.foo();  // foo
t.bar();  // bar

答案 3 :(得分:0)

创建该函数的实例后,它将立即调用以下代码。像_constructor。

return function() {
        console.log('default');
        return;
    }();

答案 4 :(得分:0)

我有以下内容:

function userClass(name, func) {
    this.name = name;
    this.func = func;    
}

function test(flag) {
    this.foo = function() {
        console.log('foo');
        return;
    }

    this.bar = function() {
        alert('bar');
        return;
    }

    return function() {
            var obj = {};
        obj["bar"] = new userClass("bar", function(){alert('bar');});
        alert('default');
        return obj;
    }();
}

var test = new test();
//test();        //prints 'default'
console.log(test);
test.bar.func();    //printf 'bar'

JSFiddle