Javascript 是否可以将显示模块模式实例传递给回调函数?
我有一些javascript使用如下所示的显示模块模式。它接受稍后调用的回调函数。我希望回调函数能够调用类中定义的函数,但它不起作用Javascript 是否可以将显示模块模式实例传递给回调函数?,javascript,revealing-module-pattern,Javascript,Revealing Module Pattern,我有一些javascript使用如下所示的显示模块模式。它接受稍后调用的回调函数。我希望回调函数能够调用类中定义的函数,但它不起作用 window.MyClass = function() { var self = this, start = function (callback) { callback(self); }, cancel = function() { console.log('Cancel invoked'); }; return {
window.MyClass = function() {
var self = this,
start = function (callback) {
callback(self);
},
cancel = function() {
console.log('Cancel invoked');
};
return {
start: start,
cancel: cancel
};
};
var myCallbackFunction = function(instance) {
instance.cancel(); // Error: instance.cancel is not a function
};
var obj = new window.MyClass();
obj.start(myCallbackFunction);
我可以将这个示例重新制作成原型模式,并且它可以按预期工作,所以我的问题是,我可以使用RMP来完成这个工作,还是这只是这个模式的一个限制
谢谢,
罗杰
然后,它既是一个实例方法,又可以通过返回值使用
但是对于这样简单的东西(例如,没有私有变量),我会使用一个直接的原型(“原型模式”)
顺便说一下,如果你正在阅读,你应该知道这些不是真正的标准术语
他还说,“虽然JavaScript的设计没有像C#或Java那样考虑类或面向对象编程的概念,但只要稍加努力,就可以获得类似的结果。”事实上,JavaScript是为面向对象编程而设计的,但它是基于原型的。正如您所看到的,它还具有足够的灵活性,可以允许其他选择;在某些情况下,这些替代方案肯定更好
您甚至不需要self,因为您的对象保持绑定状态
因此:
然后,它既是一个实例方法,又可以通过返回值使用
但是对于这样简单的东西(例如,没有私有变量),我会使用一个直接的原型(“原型模式”)
顺便说一下,如果你正在阅读,你应该知道这些不是真正的标准术语
他还说,“虽然JavaScript的设计没有像C#或Java那样考虑类或面向对象编程的概念,但只要稍加努力,就可以获得类似的结果。”事实上,JavaScript是为面向对象编程而设计的,但它是基于原型的。正如您所看到的,它还具有足够的灵活性,可以允许其他选择;在某些情况下,这些替代方案肯定更好
您甚至不需要self,因为您的对象保持绑定状态
因此:
永远不要从构造函数返回对象。这是一个奇怪的JS怪癖 您得到的不是
MyClass
的实例,而是一个普通对象。当构造函数返回一个对象时,将返回该对象,而不是返回本应返回的实例
// good!
function MyClass() {};
new MyClass().constructor // returns: function MyClass() {}
new MyClass().constructor == MyClass // true
// bad!
function MyClass() { return {a:123}; };
new MyClass().constructor // returns: function Object() { [native code] }
new MyClass().constructor == MyClass // false
简言之,古典风格和揭示模块风格并不很好地结合
在您的情况下,任何分配给属性this
的函数都会将该函数显示给外部。所以也许你想要这个
window.MyClass = function() {
var self = this;
var start = function (callback) {
callback(self);
};
var cancel = function() {
somePrivateFn();
console.log('Cancel invoked');
};
var somePrivateFn = function() {
console.log('private function!');
};
this.start = start;
this.cancel = cancel;
};
但是如果你不需要任何私有的东西(你的例子揭示了一切,所以没有什么东西是私有的),使用Matthew建议的基于原型的方法,这在所有方面都更快更简单。永远不要从构造函数返回对象。这是一个奇怪的JS怪癖 您得到的不是
MyClass
的实例,而是一个普通对象。当构造函数返回一个对象时,将返回该对象,而不是返回本应返回的实例
// good!
function MyClass() {};
new MyClass().constructor // returns: function MyClass() {}
new MyClass().constructor == MyClass // true
// bad!
function MyClass() { return {a:123}; };
new MyClass().constructor // returns: function Object() { [native code] }
new MyClass().constructor == MyClass // false
简言之,古典风格和揭示模块风格并不很好地结合
在您的情况下,任何分配给属性this
的函数都会将该函数显示给外部。所以也许你想要这个
window.MyClass = function() {
var self = this;
var start = function (callback) {
callback(self);
};
var cancel = function() {
somePrivateFn();
console.log('Cancel invoked');
};
var somePrivateFn = function() {
console.log('private function!');
};
this.start = start;
this.cancel = cancel;
};
但是,如果您不需要任何私密的东西(您的示例揭示了一切,因此没有任何东西是私密的),请使用Matthew建议的基于原型的方法,这在所有方面都更快、更简单。谢谢!我认为这是可能的——我只是没有弄清楚语法。第一个例子有点误导,原因我在回答中描述过。您根本没有得到
MyClass
的真实实例。但在这个例子中,这并不重要。但这是一个需要理解的重要细节。谢谢!我认为这是可能的——我只是没有弄清楚语法。第一个例子有点误导,原因我在回答中描述过。您根本没有得到MyClass
的真实实例。但在这个例子中,这并不重要。但这是一个需要理解的重要细节。