我需要一个类中的数据 - 如何在不创建新类的情况下获取该数据?

时间:2012-03-14 01:23:03

标签: javascript jquery prototypejs

假设我有一个类似的课程。

var foodData = Class.create({
initialize: function() {
    this.foodType = {
        "grains" : {
            "item1" : "20",
            "item2" : "60"                   
        },             
         "liquod" : {
            "item1" : "30",
            "item2" : "90"                   
        },
_someMethod: function(){

}

});

实际上,这个类很大,有很多方法。我只想访问散列“foodtype”中的数据。有没有一种方法可以进入并在没有创建新类并以这种方式阅读的情况下获得... ala

var newSomething = new foodData;
    newSomething.foodType;

3 个答案:

答案 0 :(得分:3)

是的,您的访问权限应如下所示:

var newSomething = new foodData();
newSomething.foodType;

你只需要名为all的构造函数。

但是为它创建一个getter会更好,就像这样:

var foodData = Class.create({
  initialize: function() {
    var foodType = {
        "grains" : {
            "item1" : "20",
            "item2" : "60"                   
        },             
        "liquod" : {
            "item1" : "30",
            "item2" : "90"                   
        }
     };

     this.getFoodType = function() {
         return foodType;
     };
  },
  _someMethod: function(){

    }
});

这样你可以防止有人改变它。 (虽然你应该返回foodType的CLONE,但这应该得到最终用户的点数。)

如果由于foodType中的数据大小而引起内存问题,那么您可以尝试使用此方法创建静态变量foodType。

var FoodData = (function() {
    var foodType = {
        "grains" : {
            "item1" : "20",
            "item2" : "60"                   
        },             
        "liquod" : {
            "item1" : "30",
            "item2" : "90"
        }
     };

    return new Class.create({
         initialize : function() {
         },
         getFoodType : function() {
             return foodType;
         },
         _doSomething : function() {
         }
     });
})();

现在无论你创建多少个FoodData类,它们都会共享相同的数据。

var newSomething = new FoodData();
var anotherSomething = new FoodData();

newSomething.getFoodType()与anotherSomething.getFoodType()

相同
newSomething.doSomethingToData();

newSomething.getFoodType()仍然与anotherSomething.getFoodType()

相同

答案 1 :(得分:0)

不确定我理解你,但是

       var foodData = function() {
            var foodType = {//also private
                "grains" : {
                    "item1" : "20",
                    "item2" : "60"                   
                },             
                 "liquod" : {
                    "item1" : "30",
                    "item2" : "90"                   
                };
        var someMethod = function(){}//private
        return foodType;

        }

alert(foodData());

我不是Mootools和jQuery中Class / OO模拟器的忠实粉丝,原生JS在这方面更有趣。

答案 2 :(得分:0)

如果您只想访问fooType并且不想创建该类的实例。然后一起摆脱Class.create(),只需创建一个包含函数的POJO(普通旧java对象)。

var FoodData = {
    fooType : {
        "foobar" : {
            "foo" : "10",
            "bar" : "20"
        },
        "barfoo" : {
            "bar" : "30",
            "foo" : "40"
        }
    },
    doSomething : function () {
        // Lots of something to do
    }
};

然后你可以使用:

var something = FoodData;
something.fooType;

但是你对fooType或其他东西所做的一切,都会影响FoodData对象