如何在添加即时特定私有值时自动包装共享对象以别名现有功能

How to autowrap a shared object to alias existing functionality while adding instant specific private values

我希望能够创建一个新对象,该对象实际上是现有对象的别名,但添加到新对象的新方法未添加到原始别名对象。我是 javascript 的新手,所以我不知道我想要的东西是否已经存在 and/or 是否很容易实现。为了给出我的用例的简化示例,请考虑以下内容:

假设我有一个共享对象 foo。对于 Angular 类型,想象一个服务或工厂。它看起来像这样:

var foo(){
    var array: {},
    updateArray: function(value){ array.push(value)},
    saveFoo: function(parameters){
         //save logic
    }
}

说我厌倦了不断将大量参数数组传递给 foo 的 save 方法,所以我决定向 foo 添加一个带有一些额外逻辑的包装器,以使我的生活更轻松

function addSaveableParameters(foo){
      var savedParams={}
      foo.setParam = function(parameter){
          savedParams.push(parameter);
      }
      foo.save = function(){
          foo.save(savedParams);
      }

      return foo
}

foo=addSaveableParameters(foo);

现在如果我通过简单地调用我的小辅助函数来添加 saveParameter 方法,一次将一个参数保存到 foo。

但是,我正在使用一个共享对象,具体来说是一个 angular 工厂。如果我调用 addSavableParameters,我正在修改每个人都拥有的 foo 工厂的一个版本。更重要的是,如果我有两个人正在使用我的 foo 服务并且他们每个人都调用 saveParameters 他们都会将一个参数保存到同一个共享 foo 对象,这可能会导致他们在稍后调用 save() 并找到一个他们从未添加的第二个参数存在于 foo 上。

处理这个问题的一个选择是克隆 foo。但是,原始共享 foo 有一个其他人可以修改的数组。我希望 了解该数组的更改,如果有人更改了原始 foo 的数组,我希望看到这些更改,如果我更改了 foo,我希望其他人看到我的更改。通过克隆 foo,我将创建一个新实例,该实例在克隆时仅具有 foo 数组的副本,它不会与原始共享 foo 数组的新更改保持同步。

如果我既想了解 Foo 数组的最新变化,又想拥有自己单独的 savedParameters 版本,我可以改为包装 foo:

function addSaveableParameters(foo){

      var newFoo={
          savedParams: {},
          setParam: function(parameter){
               savedParams.push(parameter);
          },
          save: function(){
             foo.save(savedParams);
          },
          save: function(parameters){
               foo.save(parameters);
          },
          updateArray: function(value){
               foo.updateArray(value);
          }
        }

   return newFoo;
}

foo=addSaveableParameters(foo);

现在我可以创建自己的 foo 版本,它反映了对旧 foo 的所有更改,通常可以用作旧 foo 的别名,但它允许我仅在 我的版本的foo.

但是,我必须手动包装函数才能做到这一点。如果我有一个非常大的对象,我可能会发现自己包装了几十个函数。我还需要提前知道 foo 的每个函数,这样我就可以为它创建一个包装器。如果有人决定稍后向 foo 添加新方法,我的包装器将不会有新方法。

javascript 中是否有方便的方法使这种包装器逻辑自动发生而无需写入特定对象?所以我可以简单地调用 wrapper(foo) 并且我将取回一个包含所有 foos 方法和变量的对象,这些方法和变量仍然是 foo 的别名,但是我可以在其中添加仅存在于 my[= 上的方法36=] 包装的 foo 对象的版本?

您可能想使用 Javascript 类,它模拟您在面向对象语言中看到的相同 类。

function Foo() {
  // private vars
  var parameters; 

  // public methods
  this.setParam = function(_params) {
    parameters = _params;
  };

  this.save = function() {
    // save parameters
  }
}

然后你可以实例化任意数量的 foos

var foo1 = new Foo();
var foo2 = new Foo();

foo1.setParams( hugeObject );
foo1.save();