将匿名函数定义为对象定义的一部分?

时间:2011-03-14 20:25:35

标签: javascript

假设我有:

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
  }
}

除了那是错的。

5 个答案:

答案 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是单线程的。