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