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