使用此关键字javascript设置属性

时间:2014-01-02 10:35:52

标签: javascript

如何在指向同一对象中的数组的对象中设置属性?

“this”关键字似乎很自然,但我收到错误。

这是我的目标。 http://jsbin.com/IPuFEpa/1/edit?js,console,output。属性“activeFlowUnit”无效。

var Converter = {
  flow: {
    valueInSiUnit: 55,
    valueInUserUnit: 0.75
  },
  units: {
    flowUnits: [{
      title: 'm3/s',
      fullTitle: 'cubic meter / second',
      decimals: 5,
      factor: 1
    }, {
      title: 'l/s',
      fullTitle: 'liter / second',
      decimals: 3,
      factor: 1000
    }]
  },
  activeFlowUnit: this.units.flowUnits[0], //Not working
  greet: function(){
    return this.units.flowUnits[0]; //Works
  },
  convertUnit: function(valueInSIUnit, factor, decimalFactor){
    var decimalConvert = Math.pow(10, decimalFactor);
    return  Math.round((valueInSIUnit * factor)*decimalConvert)/decimalConvert;
  }
}

7 个答案:

答案 0 :(得分:4)

你需要一个函数来创建正确的范围,就像函数所做的那样

activeFlowUnit: function() {
    return this.units.flowUnits[0];
},

然后你当然必须把它称为一个函数

答案 1 :(得分:2)

你只需要注意这一点:

var o = {
    prop: this === o, // false
    meth: function () {
        this === o; // true
    }
};
this === o; // false

答案 2 :(得分:1)

我会尝试让Object.defineProperty拥有一个带有getter和setter的属性:

Object.defineProperty(Converter, "activeFlowUnit", {
    get: function activeFlowUnit() {
        if (!this.units.active)
            this.units.active = this.units.flowUnits[0];
        return this.units.active;
    },
    set: function activeFlowUnit(val) {
        this.units.active = val;
    }
});

console.log(Converter.activeFlowUnit);
Converter.activeFlowUnit = Converter.units.flowUnits[1];
console.log(Converter.activeFlowUnit);

DEMO

答案 3 :(得分:0)

你不能在对象初始化器本身内完成它,没有办法从属性初始化器引用初始化器构造的对象,因为该对象尚不存在。

之后你可以这样做:

var Converter = {
    // ...all of your other init
};
Converter.activeFlowUnit = Converter.units.flowUnits[0];

this在您用作属性初始值设定项的函数中的作用是双重的:

  1. 直到稍后,在创建对象之后才会调用该函数
  2. 通过对象引用(Converter.convertUnit)调用函数是设置this的原因。

答案 4 :(得分:0)

this仅在调用方法时指向当前对象。您只需将对象的成员分配给文字中的临时变量:

var units;
var Converter = {
  ...
  units: units = {
    flowUnits: [...]
  },
  activeFlowUnit: units.flowUnits[0], //Works
  ...
}

答案 5 :(得分:0)

与对象init相同的常见pattern就是使用init方法。

 var Converter = {
   flow: {
      valueInSiUnit: 55,
      valueInUserUnit: 0.75
   },
   ...
   init : function() {
       this.activeFlowUnit = this.units.flowUnits[0]
   }
 }

 Converter.init()

答案 6 :(得分:0)

我会重写整个事情,为转换器对象创建一个原型(执行所有必需的初始化),然后从中实例化对象。

这样:

// First create a prototype of your converter...

// ...this is the constructor

function Converter(params) {
    this.flow  = params.flow;
    this.units = params.units;
    this.activeFlowUnit = this.units.flowUnits[0];
}

// ...these are the methods

Converter.prototype.greet = function() {
    return this.units.flowUnits[0];
};

Converter.prototype.convertUnit = function(valueInSIUnit, factor, decimalFactor) {
    var decimalConvert = Math.pow(10, decimalFactor);
    return  Math.round((valueInSIUnit * factor)*decimalConvert)/decimalConvert;
};



// Then instantiate an object passing the parameters

var converter = new Converter( {
    flow: {
        valueInSiUnit: 55,
        valueInUserUnit: 0.75
    },
    units: {
        flowUnits: [{
            title: 'm3/s',
            fullTitle: 'cubic meter / second',
            decimals: 5,
            factor: 1
        }, {
            title: 'l/s',
            fullTitle: 'liter / second',
            decimals: 3,
            factor: 1000
        }]
    } 
} );

现在

this.activeFlowUnit = this.units.flowUnits[0];

的范围为指向新的引用对象。