使用对象属性 - Javascript

时间:2014-10-23 11:30:52

标签: javascript object

如何从另一个属性中引用对象属性值:

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"));

1 个答案:

答案 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());