JS对象之私有属性

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

过后我就开始搜到底是啥玩意,简单归纳整合一下我所搜集的资源,如若不是很懂,正常,仙根尚浅,请继续修行,其实也不完全是这样,谁叫我们的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;其次私有和特权函数能建立只有在对象被构造函数初始化后,而与之相对的公有成员能在任何时候被添加进来。

此文完全参考自 Private Members in JavaScript  for more>>http://www.crockford.com/javascript/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值