我个人比较懒,想写的原因很简单,记一次面试,请你写个方法来创建对象的私有属性。。。???一脸懵逼过后,继续懵逼......

过后我就开始搜到底是啥玩意,简单归纳整合一下我所搜集的资源,如若不是很懂,正常,仙根尚浅,请继续修行,其实也不完全是这样,谁叫我们的JS是个让人“捉摸不透,匪夷所思”的语言呢,好吧,废话不多说,且看下文解析 =>

说到私有,我们先来看看公有

两种方法创建对象的成员变量,the first is by构造函数:

        function Container(param){

                this.member = param;

        } 一般构造函数首字母会大写,大家知道的吧,,啊哈哈,,

好,咱们来实例化一下  var myContainer = new Container('abc'); 然后 myContainer.member就有了‘abc’;

Then let us to see see the second 通过构造方法的原型prototype,说到原型,我就来balabala一下,如果在对象本身找不到要的成员,就顺着原型链去找,原型机制用于继承,还可以节省空间,一般用来加入public methods:

        Container.prototype.stamp = function(string){

                return this.member + string;

        }    我们可以调用方法myContainer.stamp('def'); 会返回‘abcdef’.

好了,做了这么多铺垫,重头戏来了,且看Private


function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var that = this; }


解释一下,这里均为私有成员变量和方法,私有方法dec引用secret私有成员变量,可用于限制该对象三次引用;对于变量that是为了让私有方法能够引用该对象的私有属性,但是这是ECMAScript语言规范一个错误的解决方案,会导致内部函数this指向被修改重置(具体嘛,我也没弄很清楚,关于this的指向问题,有兴趣的可以去查一下)

接着如果要访问私有变量和方法该怎么操作呢,这里便引入了特权函数(privileged method),对于特权函数,可以删除或者替代但是不可以修改,或是降低访问权限。


function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var that = this; this.service = function () { return dec() ? that.member : null; }; }


在这里,service是特权函数,调用mycontainer.service(),前三次会返回‘abc’,之后返回null。service函数通过调用私有方法dec获取私有变量secret的值,service函数可以被其他对象或是方法调用,但是不允许直接获取其私有成员变量。

上述公有、私有或是特权函数能实现全部建立在闭包机制存在的基础上,所谓闭包即内部函数总是能获取其外部函数的变量和参数,即使外部函数已return;其次私有和特权函数能建立只有在对象被构造函数初始化后,而与之相对的公有成员能在任何时候被添加进来。