Javascript 修改可变对象的方法?

Javascript 修改可变对象的方法?,javascript,functional-programming,pixi.js,ramda.js,Javascript,Functional Programming,Pixi.js,Ramda.js,考虑到函数式编程在尽可能多地坚持不可变变量的情况下是最好的,而且Ramda总是进行浅拷贝,那么必须可变的对象如何在一个基本上纯函数式的框架中处理呢 例如,考虑Pix.SpRITE(在Pix.js)中。显示系统有一个内在的层次结构,它链接在一起,并有自己的跟踪对象的方式,因此它可以重复使用纹理等。垃圾收集它们可能是一个真正的问题 可以采取什么样的方法来处理这一问题(以及像Na钠typescript这样强大的frp系统) 具体而言,这种方法是否可以改进: 具有某种unsafePerformIO()函

考虑到函数式编程在尽可能多地坚持不可变变量的情况下是最好的,而且Ramda总是进行浅拷贝,那么必须可变的对象如何在一个基本上纯函数式的框架中处理呢

例如,考虑Pix.SpRITE(在Pix.js)中。显示系统有一个内在的层次结构,它链接在一起,并有自己的跟踪对象的方式,因此它可以重复使用纹理等。垃圾收集它们可能是一个真正的问题

可以采取什么样的方法来处理这一问题(以及像Na钠typescript这样强大的frp系统)

具体而言,这种方法是否可以改进:

  • 具有某种unsafePerformIO()函数,可以修改重物。对这些对象的所有修改仅通过该函数完成

  • 轻量级元信息对象承载所有逻辑

  • 这些轻量级信息对象直接引用重对象

  • 下面是Typescript中的完整代码示例,用于演示它的实际应用(只需导入PIXI和Ramda)。关键行位于gameLoop()中:


    (注意,通过谷歌找到的这段对话是一个很好的参考点:)

    这是一个有趣的问题,但并不符合SO准则:。我认为您可以通过提供一个用代码表达您的问题的小片段来提高这个(已经很好的)问题的质量。谢谢您的提示,我将尝试通过codeLook进入功能镜头,特别是
    设置
    映射
    操作,来更清楚地演示问题。这是一个必须的链接。而你实际上正在寻找的技术叫做。从这个意义上讲,镜头可以给你一种非常原始的持久性。
    let app = new PIXI.Application(window.innerWidth, window.innerHeight);
    document.body.appendChild(app.view);
    
    
    let ball = new PIXI.Graphics();
    ball.beginFill(0xFF0000);
    ball.drawCircle(0,0,40);
    ball.endFill();
    
    ball.y = app.stage.height/2;
    
    app.stage.addChild(ball); //app
    
    let ticker = new PIXI.ticker.Ticker();
    ticker.add(gameLoop);
    ticker.start();
    
    let ballReference = {
        ptr: ball,
        x: 0
    }
    
    function performUnsafeIO(reference) {
        reference.ptr.x = reference.x;
    }
    function gameLoop(deltaTime:number) {
        //this version breaks!
        //ball = R.assoc('x', ball.position.x + deltaTime * 1, ball);
    
        //This works fine... but are there any gotchas?
        ballReference = R.assoc('x', ballReference.x + deltaTime * 1, ballReference);
        performUnsafeIO(ballReference);
    }