ECMAScript5中的类

ECMAScript5中的类

ECMAScript5 中支属性添加方法支持(getter,setter,可枚举性,可写性和可配置性),同时增加了类的可扩展性。

让属性不可枚举

ECMAScript 5中可以将属性设置为不可枚举的,也可以设置属性为只读的,当问我们希望将类实例设置为不可变得,这个特性非常有帮助。
Object.definePropertis()和Object.defineProperty()创建对象,方法的第一个参数为对象,第二个参数为属性,第三个对象为属性的描述;并且默认值的.
也可以使用Object.create()来创建新对象.

Object.create(o,'name':{writeable:false,enumerable:false,configerable:false})

//定义一个不可变类,让属性和方法都不可变
function Range(from,to){
    var props={
        from:{value:from,writable:true,enumerable:true,configuable:false},
        to:{value:to,enumerable:true,wirtable:false,configurable:false}
    };
    if(this instanceof Range)
    Object.defineProperties(this,props);
    else{
        Object.create(Range.prototype,props);
    }
}
//上面配置的类可读性不好
//写工具函数进行对类的配置
function freezeProp(o){
    var props =(arguments.length==1)?Object.getOwnPropertyNames(o):Array.prototype.splice.call(arguments,1);
    props.forEach(function(n){
        if(!Object.getOwnPropertyDescript(o,n).configurable)return;
        Object.defineProperty(o,n,{writable:false,configurable:false});
        
    });
    return o;
}
 
funcion hideProps(o){
    var props=(arguments.length==1)?Object.getOwnPropertyNames(o):Array.prototype.splice.call(arguments,1);
    props.forEach(funciton(n)){//将他们都设置为只读的和不可变得
    //忽略不可配置的属性
    if(!Object.getOwnPropertyDescriptor(o,n).configurable)return;
    Object.defineProperty(o,n,{enumerable:false});
    }
    return o;
}

封装对象状态

构造函数中变量和参数可以用做它创建的对象私有状态。该方法在ECMAScript3中的一个缺点是,访问这些私有状态的存取器方法是可以替换的。在ECMAScript5中可以通过定义属性getter和setter方法将状态变量更健壮地封装起来。

//封装Range类的断点严格封装起来
Function Range(from,to){
    if(from>to)throw new Error("Range:from must be<to");
}
function getFrom(){return from;}
function getTo(){return to;}
function setFrom(f){
    if(f<=to) from =f;
    else throw new Error("Rangs:from must be<=to");
}

防止类的扩展

通常认为,通过原型对象添加方法可以动态地对类进行扩展,这是JavaScript本身的特点。
在ECMAScript5中可以根据特性加以限制。
Object.preventExtension()可以将对象设置为不可扩展的,也就是说不能给对象添加任何新特性.
Object.seal()则更强大,它除了能阻止用户给对象添加新属性,还能将当前已有的属性设置为不可配置。

Object.seal(Object.prototype);

Object.freeze(),属性于seal()属性是一致的,它同样会所有属性都设置为只读和不可配置的。
使用freeze()方法设置enumeration将他的值为不可扩展,设置他的类。
设置其value,和其他的属性为不可枚举和不可配置
Object.freeze(enumeration.values);
Object.freeze(enumeration);

子类和ECMAScript5

使用ECMA5的特性实现子类,使用Object.create()来创建的对象原型。

function StringSet(){
    this.set=Object.create(null);
    this.n=o;
    this.add.apply(this,arguments);
}
//注意,使用Object.create()可以继承父类的原型
StringSet.prototype=Object.create(AbstractWritableSet.prototype,{
    constructor:{value:StringSet},
    contains:{value:function(x){return x in this.set}},
    size:{value:function(x){return this.n}}, 
    foreach:{
        value:function(f,c){
            Object.keys(this.set).forEach(f,c);
        }
    },
    add:{
        value:function(){
            for(var i=0;i<arguments.length;i++){
                if(!(arguments[i] in this.get)){
                    this.set[arguments[i]] =true;
                    this.n++
                }
            }
            return this;
        }
    },
    remove:{
        value:function(){
            for(var i=0;i<arguments.length;i++){
                if(arguments[i] in this.set){
                    delete this.set[arguments[I]];
                    this.n--;
                }
            }
            return this;
        }
    }
});

属性描述符

ECMAScript5中对属性描述符的操作,定义propertis()方法(这个方法是不可枚举的)。这个返回值是一个对象,用以表示属性的列表,并定义了有用的方法来输出属性和属性特性(对于调试非常有用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值