请考虑以下代码:
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
内调用操作bar
或test
。但是,动作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'
是否有可能实现类似的目标?
答案 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
的调用返回的内容。
所以你正在做的是将foo
和bar
函数附加到新创建的对象isntance上。
然后你return
一个不同的函数,然后从调用new Test()
而不是其上有foo
和bar
的对象实例返回...该对象只是丢失/垃圾收集。
这“从构造函数返回一个不同的对象”是不好的做法,导致混乱。加上这种情况发生了:
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'