如何在指向同一对象中的数组的对象中设置属性?
“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;
}
}
答案 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);
答案 3 :(得分:0)
你不能在对象初始化器本身内完成它,没有办法从属性初始化器引用初始化器构造的对象,因为该对象尚不存在。
之后你可以这样做:
var Converter = {
// ...all of your other init
};
Converter.activeFlowUnit = Converter.units.flowUnits[0];
this
在您用作属性初始值设定项的函数中的作用是双重的:
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];
的范围为此指向新的引用对象。