Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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/4/oop/2.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-OOP中的循环依赖_Javascript_Oop_Circular Dependency - Fatal编程技术网

JavaScript-OOP中的循环依赖

JavaScript-OOP中的循环依赖,javascript,oop,circular-dependency,Javascript,Oop,Circular Dependency,上面代码的目的是让任务访问名为doSomething的应用程序方法之一。代码是我目前的做法,我发布这篇文章是为了看看这是否是最好的方式 为了给任务访问权限,我只需传递整个App实例,这是有效的还是有更好的方法?上面的代码是否是执行类似操作的一般做法?是的,您所拥有的一切都很好。它是一个循环依赖关系,但是由于JavaScript的动态特性,实际上没有任何问题 从任务引用应用程序的另一种方法是单例模式或类似模式,但这可能更难测试。 通常,假设任务“类”未设置此处未显示的其他设施,则在该场景中使用 B

上面代码的目的是让任务访问名为
doSomething
的应用程序方法之一。代码是我目前的做法,我发布这篇文章是为了看看这是否是最好的方式


为了给任务访问权限,我只需传递整个App实例,这是有效的还是有更好的方法?上面的代码是否是执行类似操作的一般做法?

是的,您所拥有的一切都很好。它是一个循环依赖关系,但是由于JavaScript的动态特性,实际上没有任何问题

任务
引用
应用程序
的另一种方法是单例模式或类似模式,但这可能更难测试。

通常,假设
任务
“类”未设置此处未显示的其他设施,则在该场景中使用

Bind允许为函数提供上下文。这可以在应用程序的构造函数中完成。此时,只需要函数
任务
调用
“somethod”

但是,如果
任务
必须是一个“类”,并且有其他职责,那么原型功能可以共享

function task(){
    return this["someMethod"]();
}

function App(){
    task.bind(this)();
}

App.prototype.someMethod = function(){
    alert("Task needed access to this");
};

var a = new App();

您的应用程序实例和任务实例紧密绑定。应用程序实例有任务,这可以很好

松散耦合对象的设计更灵活,更易于扩展,但初始创建更复杂。其中一种模式是使用中介/发布订阅者,让应用程序引发事件/发布消息。任何其他对象函数都可以侦听此消息并对事件采取操作

例如:您的应用程序创建了一个Ajax实例,当该实例完成时,它会引发一些事件(例如fetchedData)。侦听器可以是DomDependent.updateView函数,但稍后您可能需要添加/删除/更改在获取数据后要执行的任务的顺序。这些都可以在app.init函数中配置,也可以在启动某些过程(如登录、搜索等)的控制器中的每个过程中配置

您可以创建一个通用函数,让控制器添加侦听器,或者在fetchData完成后传递下一个事件,以运行正确的下一个函数,而不是在Ajax中创建一大堆特定函数(fetchUserPrefs、login、search等等)

下面是一些伪代码:

function Task(){}
function App(){}

App.prototype.someMethod = Task.prototype.someMethod = function(){
    alert("Task needed access to this");
};

var a = new App();
a.task();//->"Task needed access to this"
var t = new Task();
t.someMethod();//->"Task needed access to this"
正如您所见,它变得复杂,可能看起来不像您习惯的代码,但它是高度可配置的

我可能误解了调解人模式对松散夫妻的好处,如果是,请发表评论。我用它来:

  • 使方法更通用,而不是只复制大量逻辑 因为完成后该做什么是不同的。在获取ajax中 对象只是获取,这与登录或获取相同 用户偏好,唯一不同的是调用什么函数 下一步/完成时出错

  • 登录之类的过程涉及多个应用程序中的多个功能 对象,如果此函数链硬编码,则每个 特定功能完成后,您的登录过程将全部定义 通过你的代码。在init/config中定义它时,您可以轻松地更改 订购或添加/删除链中的函数


  • 你做得对。
    App
    为什么需要了解
    Task
    ?我认为这个例子应该更大一些,以便全面分析方法。目前它还很小,不好的做法可能并不明显。@IonuțG.Stan,因为我已经说过了;)-这是一个例子,在我的生产代码中,有许多情况下子类需要访问主目录中的信息class@TravisJ是的,这很公平。在我的生产代码中,每个类中大约还有10-20个方法,但是关于继承实例的一般问题是相同的
    function Task(){}
    function App(){}
    
    App.prototype.someMethod = Task.prototype.someMethod = function(){
        alert("Task needed access to this");
    };
    
    var a = new App();
    a.task();//->"Task needed access to this"
    var t = new Task();
    t.someMethod();//->"Task needed access to this"
    
    var app = {
      init:function(){
        mediator.add("updateLogin",domDependent.updateView);
        mediator.add("updateLogin",app.loadUserPrefs);
        mediator.add("failLogin",domDependent.updateView);
      },
      login: function(){
        mediator.trigger("loadingSometing",{type:"login"});
        ajax.fetch({
          onComplete:"updateLogin",//what listens to updateLogin you decided in init
          onFail:"failLogin",
          loginDetails:domDependent.getLogin(),
          url:settings.loginUrl,
          type:"post"
        });
      }
    }
    
    var ajax = {
      fetch:function(data){
        data = data || {};
        //simple check for onComplete, it's mandatory
        var complete = data.onComplete || app.raiseError("ajax.fetch needs onComplete");
        //other code to validate data and making ajax request
        onSuccess:function(resp){
          //mutate data object as the mediator will pass it to
          //  whatever other function is called next
          //  you don't hard code domDependent.updateView and
          //  app.loadUserPrefs because fetch can be used generally and
          //  success may have to do completely different things after its done
          //  and you want to define procedures in init, not all over your code
          data.response=resp;
          //trigger event to do whatever needs to be done next
          mediator.trigger(complete,data);
        }
      }
    }