我们都知道js中没有private关键字,但是我们通常会使用js中的闭包来模拟,但是我们经常会在使用var和this之间抉择,会在使用类方法和对象方法抉择,那么我们有没有什么方法来解决这个问题呢?
最近在研究js,对于js模拟private,对于使用java的我总感觉有点不舒服,虽然使用_属性名的形式可以给人提示,但是不能从语法上防止其他使用的人直接访问,或者使用在构造方法内部定义,但是这样会定义多个方法,太占内存了,这我感觉都比较别扭,昨天晚上突然在想,能不能再起外面在弄一个闭包出来呢?
下面是我想到的
var Private = function() {
var id;
var Class = function() {
}<pre name="code" class="javascript">var Private = function(){
var setAndGet = false;
var obj = function Class() {
var id;
if(!setAndGet) {
Class.prototype.getId = function() {
return id;
}
Class.prototype.setId = function(pId) {
id = pId;
}
}
}
return obj;
}();
Class.prototype.getId = function() { return id; } Class.prototype.setId = function(pId) { id = pId; } return Class;}();
后来发现即使有外层的闭包还是不行,因为private的属性是类属性,不是对象属性!就想有没有其他的方法呢?
我们观察发现在类中使用this.方法这种方式是一个表达式的方式,也就是说会在执行的时候被解析,那如果我不让他多次执行,那是不是就不会有多个方法被定义呢?如下代码:
var Private = function Class() {
var id;
if(!Class.prototype.getId) {
Class.prototype.getId = function() {
return id;
}
}
if(!Class.prototype.setId) {
Class.prototype.setId = function(pId) {
id = pId;
}
}
}
但是如果我们每次定义都要使用方法都要做一个判断,我想大家都感觉不爽吧!那么有什么方法可以只需要做一次判断呢?
我在外层再创建一个闭包,在这个闭包中定义一个开关,用这个开关判断所有的get和set方法是否被声明,这样只需要做一次判断就可以了!如下为代码:
var Private = function(){
var setAndGet = false;
var obj = function Class() {
var id;
if(!setAndGet) {
Class.prototype.getId = function() {
return id;
}
Class.prototype.setId = function(pId) {
id = pId;
}
}
}
return obj;
}();