将值分配给对象的属性“ a”时,我希望更改同一对象的属性“ b”(基于值属性a)

时间:2020-07-19 17:01:24

标签: javascript properties javascript-objects

我希望.cName属性更改时,.c属性的值会自动更改。

const NameList = {
    1: 'Once',
    2: 'Twice',
    3: 'Thrice'
}

// my new "class" object
function JimsObject(a, b, c, d) {

    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
    this.cName = NameList[c];
    
}



var jimbo = new JimsObject();
jimbo.a = 48;
jimbo.b = "blah";
jimbo.c = 2;


console.log( jimbo.cName );
// Wanting output of 'Twice'

我希望输出/值是Twice

对于JavaScript来说还不是很新。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:0)

执行该函数时,您不会给该函数任何参数,因此它们都是未定义的,因此我认为您在构造类时会遇到一些错误。

您必须在函数参数中传递变量。

var jimbo = new JimsObject(48, "blah", 2);加上第四个参数d,尽管您似乎在任何地方都没有使用它。

还要考虑为变量赋予更有意义的名称!

进一步,考虑使用数组而不是对象!不过,您必须从0开始而不是1开始。

const NameList = [ "Once", "Twice", "Thrice" ];

NameList[0]将返回Once

答案 1 :(得分:0)

除非使用代理,否则您将无法听取javascript对象中原始值的变化,这对初学者来说很复杂,因此替代方法是在类中使用setter函数。

您可以这样做:

const NameList = {
    1: 'Once',
    2: 'Twice',
    3: 'Thrice'
    }

// my new "class" object
function JimsObject(a, b, c, d) {

    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
    this.cName = NameList[c];
    
}

JimsObject.prototype.setC = function (value) {
   this.c = value;
   this.cName = NameList[value];
}


var jimbo = new JimsObject();
jimbo.a = 48;
jimbo.b = "blah";

jimbo.setC(2);


document.write(jimbo.cName);
// Wanting output of 'Twice'

更改该属性的值时,也可以使用Object.defineProperty来调用setter。

const NameList = {
    1: 'Once',
    2: 'Twice',
    3: 'Thrice'
    }

// my new "class" object
function JimsObject(a, b, c, d) {

    this.a = a;
    this.b = b;
    this._c = c;
    this.d = d;
    this.cName = NameList[c];
    
}

Object.defineProperty(JimsObject.prototype, "c", {
  get: function() {
    return this._c;
  },
  set: function(value) {
    this._c = value;
    this.cName = NameList[value];
  }
});


var jimbo = new JimsObject();
jimbo.a = 48;
jimbo.b = "blah";
jimbo.c = 2;


document.write(jimbo.cName);
// Wanting output of 'Twice'

答案 2 :(得分:0)

您可以为c属性定义getterssetters

const NameList = {
  1: 'Once',
  2: 'Twice',
  3: 'Thrice'
}

// my new "class" object
function JimsObject(a, b, c, d) {
  this.a = a;
  this.b = b;
  let cVal = c;
  let that = this;
  Object.defineProperty(this, 'c', {
    get(){
      return cVal;
    },
    set(newVal){
      cVal = newVal;
      that.cName= NameList[cVal];
      return cVal;
    }
  });
  this.d = d;
  this.cName = NameList[c];
}



var jimbo = new JimsObject();
jimbo.a = 48;
jimbo.b = "blah";
jimbo.c = 2;


console.log(jimbo.cName);

您还只能为cName属性定义一个吸气剂。

const NameList = {
  1: 'Once',
  2: 'Twice',
  3: 'Thrice'
}

// my new "class" object
function JimsObject(a, b, c, d) {
  this.a = a;
  this.b = b;
  this.c = c;
  let that = this;
  Object.defineProperty(this, 'cName', {
    get(){
      return NameList[that.c];
    }
  });
  this.d = d;
}



var jimbo = new JimsObject();
jimbo.a = 48;
jimbo.b = "blah";
jimbo.c = 2;


console.log(jimbo.cName);

答案 3 :(得分:0)

您可以创建一个类jimObject

const NameList = {
    1: 'Once',
    2: 'Twice',
    3: 'Thrice'
};

class JimObject {
    constructor(a, b, c, NameList){
        this.a = a;
        this.b = b;
        this.c = c;
        this.cName = NameList[c];
    }

    get name(){
        return this.cName
    }
}

let jimbo = new JimObject(48, 'blah', 2, NameList);

console.log(jimbo);
console.log(jimbo.name);

相关问题