2009-09-08 35 views
15

在MDC发现这个但如何如果我想一个私有变量添加到如何将私有变量添加到此Javascript对象文字片段?

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 
     } 
    } 
} 

我明白OOP在JavaScript的方式,我想有机会获得dataset.tables.customers.cols [0 ]如果这样的项目存在。
但是,如果我想将一个私有变量放入客户,那会是什么样子?
添加var index = 0;会导致运行时错误。

回答

25

如果没有涉及的功能,则不能有“私有”变量。函数是在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 
    }] 
}; 

但这不会获得我们很多。这仍然主要是一堆文字对象。这些类型的“私有”变量具有零意义,因为没有方法 - 没有什么会实际读取或以其他方式使用通过添加函数(闭包)创建的范围中的变量。

但是,如果我们有一种方法,那实际上可能开始变得有用。在JavaScript

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

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

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

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

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

所以dataset.secretCounter()有varable c这是私有的只有功能。

+0

哦!我想你让我回到正轨。数据结构不能拥有私有成员,因为他们只是声明数据(一切都是公开的!),但如果我将它重写成静态类/ singlelton(var obj = function(){}();),我将能够如此。那是对的吗?谢谢。 :) – 2009-09-08 21:19:52

4

私有变量使用的是瓶盖内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()); 
+2

var d =新数据集();或者是:var d = dataset(); – pkario 2010-09-30 08:02:18

相关问题