像这样的东西?
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();
演示