【问题标题】:Can javascript pass itself from inside the constructorjavascript可以从构造函数内部传递自己吗
【发布时间】:2014-07-27 13:17:23
【问题描述】:

我该怎么做:

var abc = (function(){ 
  ..  
})();

register(abc); // outside the protected class

对此:(没有在类外调用注册):

function register(object){ stores the object }

var abc = (function(){
     ..       

     register(this); // inside the protected class
})();

一些背景。

主类有一个插件对象数组,“注册”函数放置插件。 abc 就是这样一个插件。模块模式闭包之后的插件。我想将插件实例放入列表中,并且插件尽可能自包含。我想删除插件之外的其他功能。

我考虑过: MasterClass.plugins.abc = (函数..) 但我认为这会在加载任何插件之前创建对要实例化的 MasterClass.plugins 的依赖。

【问题讨论】:

  • 这看起来很尴尬。为了减少 abc 和 register 之间的耦合,您至少应该将 register 函数传递给构造函数(想想“注入”)。
  • 直到右侧表达式的评估完成后才会发生赋值,因此 IIFE abc 内的任何位置都将是未定义的。
  • 也许你可以解释一下你想要什么?
  • 我看不出第二种方法有什么问题,只要您不在第二个函数中重新定义 register ,由于关闭,您可以使用 register 函数,主要的退步是你会将你的类耦合到 register 函数,这是一个坏主意,所以就像@Makkes 所说你应该将你的 register 函数作为构造函数参数传递,所以如果在某个时候你决定提供其他注册方法,你只需要更改构造函数被调用的函数,它也有助于测试是什么使它成为一个好的实践。

标签: javascript class object


【解决方案1】:

您可以使用 Function.prototype.bind() (修改 this 值)和里面的 var,像这样:

(function(){
var fun = function(){ alert( this.toString() )}
fun.bind(fun)();
})()

在你的情况下:

(function(){
var fun = function(){ alert( this.toString() )}
register(fun);
})()

【讨论】:

    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2013-09-14
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多