如何将私有变量添加到此Javascript对象文字片段?

时间:2009-09-08 20:56:44

标签: javascript object-literal

在MDC找到了这个,但是如果我想在

中添加一个私有变量
var dataset = {
    tables:{
        customers:{
            cols:[ /*here*/ ],
            rows:[ /*here*/ ]
        },
        orders:{
            cols:[ /*here*/ ],
            rows:[ /*here*/ ]
        }
    },
    relations:{
        0:{
            parent:'customers', 
            child:'orders', 
            keyparent:'custid', 
            keychild:'orderid',
            onetomany:true
        }
    }
}

我在Javascript中理解OOP的方式,如果存在这样的项目,我可以访问dataset.tables.customers.cols [0]。
但是,如果我想将一个私有变量放入客户,那会是什么样的呢? 添加var index = 0;会导致运行时错误。

3 个答案:

答案 0 :(得分:26)

如果没有涉及函数,您不能拥有“私有”变量。函数是在javascript中引入新范围的唯一方法。

但永远不要害怕,你可以在正确的位置添加功能,以便在你的对象中获得这种功能

var dataset = {
  tables: {
    customers:(function(){
      var privateVar = 'foo';
      return { 
        cols:[ /*here*/ ],
        rows:[ /*here*/ ]
      }
    }()),
    orders:{
      cols:[ /*here*/ ],
      rows:[ /*here*/ ]
    }
  },
  relations: [{
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid',
    onetomany:true
  }]
};

但这并没有让我们受益匪浅。这仍然只是一堆文字对象。这些类型的“私有”变量没有任何意义,因为没有方法 - 没有任何实际读取或以其他方式使用我们通过添加函数(闭包)创建的范围中的变量。

但如果我们有一个方法,那实际上可能会开始变得有用。

var dataset = {
  tables: {
    customers:(function(){
      var privateVar = 'foo';
      return { 
        cols:[ /*here*/ ],
        rows:[ /*here*/ ],
        getPrivateVar: function()
        {
          return privateVar;
        }
      };
    }()),
    orders:{
      cols:[ /*here*/ ],
      rows:[ /*here*/ ]
    }
  },
  relations: [{
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid',
    onetomany:true
  }]
};

alert( dataset.tables.customers.getPrivateVar() );

答案 1 :(得分:10)

JavaScript缺乏您在更严格的语言中获得的那种访问控制。您可以使用closures模拟对象数据的私有访问,但您的示例是一个对象文字 - 一个简单的数据结构 - 而不是一个构造的对象。

它取决于您想要对象做什么 - “私有”成员的常规技术意味着它们只能由成员函数访问,并且要求您使用构造函数来创建对象。文字语法用于具有公共数据和函数的数据结构或轻量级对象。

使用私有闭包模式的问题是文字中的字段在公共范围内,但闭包给出的隐私是因为变量是在函数中定义的,因此本地作用域。您可以创建一个克隆文字并添加私有字段的函数,也可以添加一个包含私有数据的公共字段。您还可以将闭包添加为成员,因此创建私有字段,这些字段是方法私有而不是对象私有。

dataset = {
    secretCounter: ( 
      function () {
      var c = 0;
      return function () { return ++c; }
    })(),      
   ...

所以dataset.secretCounter()有一个varable c,它只对该函数是私有的。

答案 2 :(得分:4)

javascript中的私有变量是使用闭包内的var关键字完成的。 只有特权方法和属性才能访问它。 这是方法:

function dataset()
{
var private_stuff = 10; // private
this.foo = new function() { alert(private_stuff); } // priviliged
return {
    tables:{
        customers:{
                cols:[  ],
                rows:[  ]
        },
        orders:{
                cols:[  ],
                rows:[  ]
        }
    },
    relations:{
        0:{
                parent:'customers', 
                child:'orders', 
                keyparent:'custid', 
                keychild:'orderid',
                onetomany:true
        }
    }
}; // public
}

var d = new dataset;
alert(d.foo());