js实现类似于java的private

我们都知道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; 
}();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值