Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以将显示模块模式实例传递给回调函数?_Javascript_Revealing Module Pattern - Fatal编程技术网

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 {

我有一些javascript使用如下所示的显示模块模式。它接受稍后调用的回调函数。我希望回调函数能够调用类中定义的函数,但它不起作用

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
的真实实例。但在这个例子中,这并不重要。但这是一个需要理解的重要细节。