在js的面向对象写法中,并没有特定的静态属性,私有属性和公有属性。

一般来说,静态属性是直接给构造函数增加一个属性。

function con(){}

con.staticProperty=1;

由此实现静态方法。

而实例中的属性,一般都是公有的。

function con(){}

con.prototype.firstProperty=1;

con.prototype.secondProperty=2;

var obj=new con();

console.log(obj.firstProperty);

console.log(obj.secondProperty);

如上例,两个属性,都可以被实例obj调用,因此都是公有属性。

——————————————————————————————————-

对于私有属性的实现,JS中并没有给出方法,事实上,JS本身并没有私有,公有之说。

实现JS的私有属性,只能通过一些“取巧的办法”.

也看过蛮多的“取巧”,比较流行的办法是通过闭包。

function con(){

var privateObj={};

this.publicMethod=function(){ alert(privateObj);}

}

var obj=new con();

console.log(obj.publicMethod);

console.log(obj.privateObj);

new的过程中,由于方法pubicMethod引用了con的内部对象privateObj,形成了闭包,使得privateObj成为了“私有”。

这个办法有两个缺点:1,使用了闭包,过多的使用闭包肯定是不好的。 2,方法必须写在con函数的内部,如果用prototype,则无法引用privateObj。

———————————————————————————————————————————————

前几天在写JS,突然想到一个办法,来分享讨论一下。。。

function con(){
return this.makePublic();
}
con.prototype.privateFunc=function(o){alert(o)};
con.prototype.publicFunc=function(o){alert(o+1)};
con.prototype.testFunc=function(o){this.privateFunc(o);}
con.prototype.makePublic=function(){
var self=this;
return {
publicFunc : function(){self.publicFunc.apply(self,[].slice.call(arguments))},
testFunc : function(){self.testFunc.apply(self,[].slice.call(arguments))},
constructor:con,
proto:self
}
}
var obj=new con();
obj.publicFunc(1);
obj.testFunc(1);
console.log(obj.privateFunc);
这段代码的本质,就是用new操作符时,如果构造函数返回了一个对象,则实例会被赋值为返回的对象 这个办法,来从所有的方法中,抓出几个来return作为公有的,其他的无法被访问,就变成了私有的方法。
我的这个办法也有两个缺点: 1,构造函数中,也必须写上return this.makePublic     2,原型链被打破了。
————————————————————————————————————————————————
抛砖引玉,希望能得到更好的办法来模拟私有属性。