Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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_Typescript - Fatal编程技术网

Javascript 如何在类内部构造类的使用,以避免循环引用?

Javascript 如何在类内部构造类的使用,以避免循环引用?,javascript,typescript,Javascript,Typescript,我有以下引擎类,它使用两个扩展基本渲染器类的渲染器类: import {RendererOne} from "./renderer-one"; import {RendererTwo} from "./renderer-two"; export class engine { coordinates: number; randomPropery: string; produceRenderer (type, params) { switch type

我有以下引擎类,它使用两个扩展基本渲染器类的渲染器类:

import {RendererOne} from "./renderer-one";
import {RendererTwo} from "./renderer-two";

export class engine {

    coordinates: number;
    randomPropery: string;

    produceRenderer (type, params) {

        switch type {
            case "map":
                return new RendererOne(this, params)
            case "other":
                return new RendererTwo(this, params)
            default:
                return null;
        }

    }
}
BaseRenderer类的定义如下:

import { engine} from "./index";


export abstract class BaseRenderer {

    engine: engine;

     constructor(engine: engine, params?) {

         this.engine = engine;

     }

     //various drawing methods defined here which are common to all renderers

    attach () {

        const engine = this.engine;

        //use engine defined methods and engine properties inside here

    }

}
下面是一个扩展baseRenderer的渲染器的粗略示例:

import {BaseRenderer} from "./base-renderer";
import { engine } from "./index";

export class RendererOne extends BaseRenderer {

    madeUpProperty: string;
    params: any;

    constructor(engine: engine, params?) {
        super(engine, params);
        var derivedParams = this.params;
    }


}
上述内容会导致循环引用,那么,构建类似于上述内容的代码的正确方法是什么


渲染器需要访问引擎对象属性及其方法。这是精简的玩具代码,因此请原谅任何粗略的输入错误-希望它能传达我所面临的问题。

您应该查看工厂设计模式,我认为这可能会对您有所帮助,您将拥有一个类RenderFactory,负责确定应该创建哪种类型的渲染器

编辑:这样您的引擎就不必同时导入两个类,而只导入工厂


编辑#2:另外,既然您在渲染器类的构造函数中传递了引擎,为什么要导入它?

您应该查看Factory设计模式,我认为这可能会对您有所帮助,您将拥有一个类RenderFactory,负责确定应该创建哪种类型的渲染器

编辑:这样您的引擎就不必同时导入两个类,而只导入工厂

编辑#2:另外,既然在渲染器类的构造函数中传递了引擎,为什么要导入它