JS类中能模拟出依赖对象本身的可变的私有属性吗?

JS是轻量级语言,在类的概念上没有如Java那样严格意义上私有函数,公有函数,私有属性,公有属性。但是我们考虑到复用,仍然会希望能够模拟出这些特性。有关私有函数、公有函数的方法,其实蛮简单,就是把私有函数以变量的形式,扔到prototype的闭包中;公有函数则以返回的形式暴露在外面。

 

 

function People() {

};

People.prototype = (function(){
	var _private = function(){};

	var public = function(name){
              _private.call(this);
	};

	return {
               public : public 
	};
})();

 

 

大神说,这个严格来说不是私有函数,因为不搞私有属性没有依赖,但是这种把一个函数自己依赖的其它函数放在闭包里是个很好的习惯。

 

写出来了“私有函数”和公有函数,那么私有属性可否创建呢,比如如下需求的

 

 

var person = new People('xxx');

person.name; // undefined

person.getName(); // 'xxx';

 

我刚开始试图这样写

 

function People(name) {
       this.setName(name);
};

People.prototype = (function(){
        var _name;
        var getName = function(){
	      return _name;
        };

	var setName = function(name){
             _name = name;
	};

	return {
            getName : getName,
            setName : setName
	};
})();

 

我创建一个实例

 

var me = new People('xxx');

console.log(me.name);
console.log(me.getName());

 

结果却是符合了要求。但是,我再创建一个实例

 

var me = new People({name:'L'});
var you = new People({name:'J'});
console.log(me.name);
console.log(me.getName());
console.log(you.name);
console.log(you.getName());

 

然后你会发现,打印出来的都是 'undefined' 'J'。也就是说,原型的_name被最后一个创建的实例改掉了,原因嘛,就是因为_name在原型里,是所有实例共用的。。。

 

因此在JS的类中模拟私有属性是不成立的。忍受下洁癖,还是开放出来吧。

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值