日期:2014-05-16  浏览次数:20417 次

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的类中模拟私有属性是不成立的。忍受下洁癖,还是开放出来吧。

?