1
var foo = (function(){

    var c = function(requests) {   
        bar();
    };

    c.prototype = {
        bar: bar
    };

    return c;

})();

var f = new foo();

f.baz(function(){
    console.log('new instance of foo created');
});

http://jsfiddle.net/LecJM/

我想创建一个回调函数,在foo创建“类”的新实例时调用该函数。这可能吗?显然上面的代码不会编译,我只是想让你了解我想要实现的目标。

4

3 回答 3

2
var Foo = function (createdCallback) {   
   createdCallback();
   return this;
};

var bar = new Foo(function () {
   console.log("instance created");
});

这是你想要达到的目标吗?

于 2013-09-02T08:52:29.610 回答
1

这样的东西?

var foo = (function(){

    var c = function(requests) {
        // Initialize your instance
        // ...

        // Notify
        notifyCreated(this);
    };
    c.prototype = { ... };

    var createdCallbacks = [];
    c.onCreate = function(callback) {
        createdCallbacks.push(callback);
    }

    function notifyCreated(instance) {
        // Note: forEach requires ES5 or a shim
        // Just use whatever you want to loop over the array
        createdCallbacks.forEach(function(callback) {
           callback(instance); 
        });
    }

    return c;

})();

// Add callback *before* creating instances
foo.onCreate(function(instance){
    console.log('new instance of foo created', instance);
});
// Create an instance
var f = new foo();

基本上,您向foo(而不是)添加一个方法来foo.prototype添加回调。在您的构造函数中,您调用所有已注册的回调(此处使用单独的内部函数进行演示)。要使用,您首先注册一个回调,然后开始创建实例。

编辑:根据要求,只有一个回调:

var foo = (function(){

    var c = function(requests) {
        // Initialize your instance
        // ...

        // Notify
        notifyCreated(this);
    };
    c.prototype = { ... };

    // Use a dummy callback by default
    var notifyCreated = function(){};
    c.onCreate = function(callback) {
        notifyCreated = callback;
    }

    return c;

})();

演示

编辑 2:哎呀,如果您只需要一个回调,您不妨摆脱该onCreate函数并将回调公开为变量。不过,这有一些缺点:

  • 你不能做输入检查,例如你不能在存储之前测试回调是否真的是一个函数。
  • 其他人可以通过外部触发回调foo.onCreate(anInstance)

如果这些都没有问题(例如,如果你没有公开foo),请随意使用这个非常简单的片段:

var foo = (function(){

    var c = function(requests) {
        // Initialize your instance
        // ...

        // Trigger callback
        c.onCreate(this);
    };
    c.prototype = { ... };

    // Expose callback on "class"
    c.onCreate = function(){};

    return c;

})();

// Set callback *before* creating instances
foo.onCreate = function(instance){
    console.log('new instance of foo created', instance);
};
// Create an instance
var f = new foo();

演示

于 2013-09-02T08:58:07.213 回答
0

试试这个

var foo = function() {
    this.baz();
};
foo.prototype.baz = function () {
    console.log('new instance of foo created');
};

var f = new foo();
于 2013-09-02T08:56:00.543 回答