如何从另一个属性中引用对象属性值:
var myObj = {
distance: function(){ x=2; y=2; return x + y ;},
distanceKm: //here reference to myObj distance's returned value
}
我的对象属性包含多个计算函数,我希望从同一个对象中访问这些值。
如果我在distanceKM中使用this
,我会引用distanceKM还是父对象(myObj)
谢谢,
我的用法基于JLR的回答:
var myObj = {
distance: function (unit) {
var radlat1 = Math.PI * this.goingFrom[0] / 180;
var radlat2 = Math.PI * this.goingTo[0] / 180;
var radlon1 = Math.PI * this.goingFrom[1] / 180;
var radlon2 = Math.PI * this.goingTo[0] / 180;
var theta = this.goingFrom[0] - this.goingTo[0];
var radtheta = Math.PI * theta / 180;
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist);
dist = dist * 180 / Math.PI;
dist = dist * 60 * 1.1515;
if (unit == "K") {
dist = dist * 1.609344
};
if (unit == "N") {
dist = dist * 0.8684
};
return dist;
},
goingFrom: [x1, y1],
goingTo: [x2, y2]
}
console.log(myObj.distance("N"));
答案 0 :(得分:2)
本质上,对象文字不能引用自身,所以你不能做这样的事情:
var myObj = {
distance: function(){ var x=2, y=2; return x + y ;},
distanceKm: this.distance() * 1.6 // Will not work - `this` does not
// refer to myObj here
};
console.log(myObj.distanceKm);
但是,如果distanceKm
是一个函数,那么可以执行此操作:
var myObj = {
distance: function(){ var x=2, y=2; return x + y ;},
distanceKm: function() { return this.distance() * 1.6; }
};
console.log(myObj.distanceKm());
这是可能的,因为this
中的distanceKm
在实际调用时(在myObj
已经创建之后)具有意义,而不是myObj
时创建
所以这真的是你想要做的事情。如上所述,你的问题太模糊,无法以某种方式说出任何结论。
第一种方法的另一种替代方法是在事实之后分配一些属性:
var myObj = {
distance: function(){ var x=2, y=2; return x + y ;}
};
myObj.distanceKm = myObj.distance() * 1.6;
console.log(myObj.distanceKm);
另一种方法是使用立即调用的函数,并在使用对象文字之前定义一些部分:
var myObj = (function () {
function ds() { var x = 2, y = 2; return x + y; }
return {
distance: ds,
distanceKm: ds() * 1.6
};
})();
作为旁注,请使用var
声明您的变量。使用变量而不声明它们是非常糟糕的做法。
修改:关于您的具体示例,this
会在您调用函数时引用.
之前的内容。所以你可以像这样定义你的对象:
var myObj = {
distance: function (unit) {
var radlat1 = Math.PI * this.goingFrom[0] / 180;
var radlat2 = Math.PI * this.goingTo[0] / 180;
var radlon1 = Math.PI * this.goingFrom[1] / 180;
var radlon2 = Math.PI * this.goingTo[0] / 180;
var theta = this.goingFrom[0] - this.goingTo[0];
var radtheta = Math.PI * theta / 180;
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist);
dist = dist * 180 / Math.PI;
dist = dist * 60 * 1.1515;
if (unit === "K") {
dist = dist * 1.609344
} else if (unit === "N") {
dist = dist * 0.8684
}
return dist;
},
distanceKm: function () { return this.distance("K"); },
distanceN: function () { return this.distance("N"); },
goingFrom: [x1, y1],
goingTo: [x2, y2]
}
console.log(myObj.distanceKm());