假设我有:
var myfunc = function() {
// do stuff
}
myfunc.foo = function() {
//do other stuff
};
现在myfunc
有一个属性foo
,这是一个很好的功能。有没有办法在这个状态下从一开始就创建myfunc
?也就是说,我希望在创建foo
时定义myfunc
。我想,语法是这样的:
var myfunc = {
:function() {
// do stuff
},
foo: function() {
// do other stuff
}
}
除了那是错的。
答案 0 :(得分:3)
你可以在一个对象中放置一个匿名函数,但是这样做的唯一合理方法是在初始化对象时调用匿名函数,否则函数永远不会被调用 - 它是匿名的!
这是一个JSFiddle:http://jsfiddle.net/g105b/99K5F/
var myfunc = function() {
this.foo = function() {
console.log("myfunc.foo called!");
};
(function() {
console.log("Anonymous function called.");
})();
};
// Initialising "myfunc" will call the anonymous function.
var instance = new myfunc();
// Now the foo method can be called.
instance.foo();
答案 1 :(得分:3)
对于你在这里获得的功能有点困惑......
如果您希望在定义myfunc时执行某些代码,则可以使用模块模式:
var myfunc = (function() {
var self = {};
// any initialization code can go here
alert("myfunc init code");
self.somePublicMethod = function () {
}
return self;
}());
这也可称为立即函数,即同时定义和执行的函数。
从闭包内部开始,当定义对象时,将执行未定义为另一个函数的一部分的代码,因此当您执行以下操作时:
myfunc.somePublicMethod()
警报已被解雇。
答案 2 :(得分:2)
(在问题的前半部分之前写的这个答案被大幅修改)
现在myfunc的属性
foo
是一个函数
不,它没有。
您使用myfunc()
来调用它,因此this
是对全局window
对象的引用,因此您正在创建window.foo
。
您可能正在寻找的是:
function myfunc () {
// do stuff when myfunc is called
}
myfunc.foo = function () {
// do stuff when myfunc.foo is called
};
或者也许:
function myfunc () {
// do stuff when myfunc is instantiated
this.foo = function () {
// Add a foo property to this when myfunc is instantiated
// ... which is only worth while if you are doing pretty
// ... odd stuff with the variables that are passed in
}
}
var instance = new myfunc();
或者也许:
function myfunc () {
// do stuff when myfunc is instantiated
}
myfunc.prototype.foo = function () {
// Have a foo function on every instance of myfunc
}
var instance = new myfunc();
...但你在问题中已经解决了你想要解决的问题,所以很难说出你实际想要实现的目标。
答案 3 :(得分:0)
你可以使用jQuery:
var myFunc = jQuery.extend(
function() { ... },
{
bar: "wioll haven be",
foo: function() { alert(myFunc.bar); }
}
);
myFunc();
myFunc.foo();
答案 4 :(得分:0)
这主要是代码杂技,这可能是你最接近的:
var myfunc;
(myfunc = function(){}).foo = function(){};
之后声明方法没有实际区别,因为javascript是单线程的。