JavaScript利用装饰模拟实现私有状态

  在经典的面向对象编程中,经常需要将对象的某个状态封装或隐藏在对象内,只有通过对象的一幅幅和能访问这些状态,对外只暴露一些重要的状态变量可以直接读写。

  我们可以通过将变量(或参数)装饰在一个构造函数内来模拟实现私有实例字段,调用构造函数会创建一个实例。

function Range(from,to){
    //不要将商战保存为对象的属性,相反
    //定义存取器函数来返回端点的值
    //这些值都保存在闭包中
    this.from=function(){return from;}
    this.to=function(){return to;}
}

Range.prototype={
    constructor:Range,
    includes:function(x){return this.from() <=x && x<=this.to();},
    foreach:function(f){
        for(var x=Math.ceil(this.from()),max=this.to();x<=max;x++;)
            f(x);
    },
    toString:function(){
        return "(" +this.from() +"..." +this.to() +")"; 
    }
}
//调用:
var r=new Range(0,5);       //一个不可修改的范围
r.from=function(){    return 0; }  //通过这个方法来修改它

  需要注意的是,这种封装技术造成了更多系统开销。使用了闭包来封闭类的状态的类一定会比不使用封装的状态变量的等价类运行速度更慢,并占用更多内存。

来源于《Javascript权威指南》 9.6.6

原文地址:https://www.cnblogs.com/-------perfect/p/4616748.html