【问题标题】:Update another property, when a property changes?当属性更改时更新另一个属性?
【发布时间】:2020-02-21 19:04:25
【问题描述】:

我想在我的 javascript 对象上创建一个依赖属性。 我有一个像代码 sn-p 中的对象。我想更新 isPawn 属性; isNew 属性何时发生变化。

有没有办法自动做类似的事情;

if(isNew){
   isPawn = true;
}

但它们不必相同。当 isPawn 为 'true' 时,isNew 可以为 'false'

我的对象:

var Soldier = function (id,name) {
    this.id = id;
    this.name = name;
    this.isPawn = false;
    this.isNew = false;
}

【问题讨论】:

    标签: javascript oop properties


    【解决方案1】:

    是的,您可以使用 setter 执行此操作,这是一个示例:

    class Soldier {
      #isNew = false;
      constructor(id,name) {
        this.id = id;
        this.name = name;
        this.isPawn = false;
      }
    
      set isNew(val) {
        this.#isNew = val; 
        this.isPawn = val;
      }
    
      get isNew() {
        return this.#isNew;
      }
    }
    
    const soldier = new Soldier();
    soldier.isNew = true;
    console.log('isNew:', soldier.isNew, 'isPawn', soldier.isPawn);
    soldier.isNew = false;
    console.log('isNew:', soldier.isNew, 'isPawn', soldier.isPawn);
    soldier.isPawn = true;
    console.log('isNew:', soldier.isNew, 'isPawn', soldier.isPawn);

    #isNewprivate field 在这种情况下,我使用它来跟踪 isNew 的值应该是什么(getter 应该返回什么)。

    这是一个使用函数而不是类的示例:

    var Soldier = function(id, name) {
      this.id = id;
      this.name = name;
      this.isPawn = false;
      this.isNewPriv = false;
      Object.defineProperty(this, 'isNew', {
        set: function(val) {
          this.isNewPriv = val;
          this.isPawn = val;
        },
        get: function() {
          return this.isNewPriv
        }
      });
    }
    
    var soldier = new Soldier(1, 'none');
    soldier.isNew = true;
    console.log("isNew:", soldier.isNew, "isPawn:", soldier.isPawn);
    soldier.isNew = false;
    console.log("isNew:", soldier.isNew, "isPawn:", soldier.isPawn);
    soldier.isPawn = true;
    console.log("isNew:", soldier.isNew, "isPawn:", soldier.isPawn);

    【讨论】:

    • 我认为这是(getter/setter)解决方案。但是这件事让我很困惑。它有什么用?
    • @İkbal_BLGNR 我已经编辑了这个问题并提供了一些细节。
    • @İkbal_BLGNR 我添加了一个扩展您当前功能的示例,也许这更容易理解。
    【解决方案2】:

    根据需要创建一个类并实例化

    class Soldier {
      constructor(id, name, isNew) {
        this.id = id;
        this.name = name;
        this.isPawn = isNew? true : {something : "whaterverElse"};
        this.isNew = isNew;
      }
      
      DoSomething(){
        this.isNew = false;
      }
      
    }
    
    var soldier = new Soldier(1, 'Tim', true);
    
    console.log(soldier);
    
    function somethingElseHappened(){
      soldier.DoSomething();
    }
    
    somethingElseHappened();
    
    console.log(soldier);

    【讨论】:

      【解决方案3】:

      您可以像这样为此属性设置默认值:

      var Soldier = function (id,name,isPawn = false,isNew = false) {
          this.id = id;
          this.name = name;
          this.isPawn = isPawn;
          this.isNew = isNew;
      }
      
      

      如果您想为您更改任何对象的值,只需这样做:

      var newSolider = new Solider(1,"foo",false,true);
      

      【讨论】:

      • 当isNew属性发生变化时; isPawn 属性会自动更改吗??
      • 不,不会
      • 它们不一样,也没有不同。所以我认为这是最好的方法
      猜你喜欢
      • 2017-04-24
      • 2019-07-08
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多