function Container(param) { 
function dec() { 
if (secret > 0) { 
secret -= 1; 
return true; 
} else { 
return false; 
} 
} 
this.member = param; 
var secret = 3; 
var that = this; 
} 
function Container(param) { 
function dec() { 
if (secret > 0) { 
secret -= 1; 
return true; 
} else { 
return false; 
} 
} 
this.member = param; 
var secret = 3; 
var that = this; 
} 
private方法dec检查secret实例变量。如果它大于0,则减少secret并返回true,否则返回false。它可以用来让这个对象限制用3次。
按照惯例,我们定义一个private的that变量。这用来让private方法可以使用本对象。这样做是因为ECMAScript语言规范有一个错误,
该错误导致不能正确的设置this给内部方法。
private方法不能被public方法调用。为了让private方法有用,我们需要引入privileged方法。
Privileged
privileged方法可以访问private变量和方法,并且它本身可以被public方法和外界访问。可以删除或替代privileged方法,但是不能
更改它或强制它泄露自己的秘密。
privileged方法在构造函数里用this分配。
Java代码
复制代码 代码如下:
 
function Container(param) { 
function dec() { 
if (secret > 0) { 
secret -= 1; 
return true; 
} else { 
return false; 
} 
} 
this.member = param; 
var secret = 3; 
var that = this; 
this.service = function() { 
if (dec()) { 
return that.member; 
} else { 
return null; 
} 
}; 
} 
function Container(param) { 
function dec() { 
if (secret > 0) { 
secret -= 1; 
return true; 
} else { 
return false; 
} 
} 
this.member = param; 
var secret = 3; 
var that = this; 
this.service = function() { 
if (dec()) { 
return that.member; 
} else { 
return null; 
} 
}; 
} 
service是privileged方法。前三次调用myContainer.service()将返回'abc'。之后,它将返回null。service调用private的dec方法,
dec方法访问private的secret变量。service对其他对象和方法可见,但是它不允许直接访问private变量。
闭包
由于JavaScript有闭包,public,private和privileged成员的模式是可行的。这意味着一个内部方法始终可以访问它的外部方法的
var变量和参数,甚至在外部方法返回之后。这是JavaScript语言的一个非常强大的特性。当前没有展示如何发掘这种特性的JavaScript
编程书籍,大多数甚至都没提到。
private和privileged成员只能在对象被构造时产生。public成员则可以在任何时候添加。
模式
public
Java代码
复制代码 代码如下:
 
function Constructor(...) { 
this.membername = value; 
} 
Constructor.prototype.membername = value; 
function Constructor(...) { 
this.membername = value; 
} 
Constructor.prototype.membername = value; 
Private
Java代码
复制代码 代码如下:
 
function Constructor(...) { 
var that = this; 
var membername = value; 
function membername(...) {...} 
} 
// 注意: function语句 
// function membername(...) {...} 
// 是如下代码的简写 
// var membername = function membername(...) {...}; 
function Constructor(...) { 
var that = this; 
var membername = value; 
function membername(...) {...} 
} 
// 注意: function语句 
// function membername(...) {...} 
// 是如下代码的简写 
// var membername = function membername(...) {...}; 
Privileged
Java代码
复制代码 代码如下:
 
function Constructor(...) { 
this.membername = function (...) {...}; 
} 
function Constructor(...) { 
this.membername = function (...) {...}; 
} 
译者注:我认为可以简单的把privileged方法简单的看成是构造函数里的public方法,因为privileged方法可以被外界和public方法访问,
而它自身又可以访问private变量。
