15

在 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;会导致运行时错误。

4

3 回答 3

27

如果不涉及函数,您就不能拥有“私有”变量。函数是在 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() );
于 2009-09-08T21:22:33.047 回答
10

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

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

使用私有闭包模式的问题是文字中的字段处于公共范围内,但闭包提供的隐私是因为变量是在函数中定义的,因此是局部范围的。您可以创建一个克隆文字并添加私有字段的函数,或者添加一个具有私有数据的公共字段。您还可以将闭包添加为成员,因此创建方法私有而不是对象私有的私有字段。

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

所以dataset.secretCounter()有一个c仅对该函数私有的变量。

于 2009-09-08T21:01:39.723 回答
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());
于 2009-09-08T21:26:29.487 回答