Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将私有变量添加到此Javascript对象文字片段?_Javascript_Object Literal - Fatal编程技术网

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

如何将私有变量添加到此Javascript对象文字片段?,javascript,object-literal,Javascript,Object Literal,在MDC上发现了这个,但是如果我想向 var dataset = { tables:{ customers:{ cols:[ /*here*/ ], rows:[ /*here*/ ] }, orders:{ cols:[ /*here*/ ], rows:[ /*here*/ ] } }, relations:{

在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指数=0会导致运行时错误。

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

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

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

dataset = {
    secretCounter: ( 
      function () {
      var c = 0;
      return function () { return ++c; }
    })(),      
   ...
因此,
dataset.secretCounter()
有一个变量
c
,它只对该函数私有。

如果没有函数,就不能有“私有”变量。函数是在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() );

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

哦我想你让我回到了正轨。数据结构不能保存私有成员,因为它们只是声明数据(所有内容都是公共的!),但是如果我将其重写为静态类/singlelton(var obj=function(){}();),我就可以这样做。对吗?谢谢。:)var d=新数据集();或者是:var d=dataset();