JavaScript对象的扩展性

var obj={};

console.log(Object.isExtensible(obj));//检测对象是否可扩展

//通过preventExtensions()将对象变为不可扩展的,不能反转为可拓展。

obj1=Object.preventExtensions(obj);

console.log(obj===obj1);//ture

 

Object.seal();//封闭对象

对象的属性不可配置,设置不可扩展,不可配置。不能添加新属性,已有的可写的属性可以设置。

Object.freeze()//Object.isFroze()检测是否冻结

属性变为只读,不可扩展,不可设置。如果有对象存储器有setter方法,存储器不受影响。

///此时的冻结是浅冻结。
 

var obj1={

    internal:{}

};

object.freeze(obj1);

obj1.internal.x=1;

console.log(obj.internal.x);//1

//深度冻结
 

function deepFreeze(obj){

    var  prop,propKey;

    Object.freeze(obj);

    for(propKey in obj){

        prop=obj[propKey];

        if(!obj.hasOwnProperty(propKey)||!(typeof prop==='object')||object.isFroze(prop)){

continue;

        }

deepFreeze(prop);

    }

}

var obj2={

    internal:{}

};

deepFreeze(obj2);

obj2.internal.x=1;

console.log(obj2.internal.x);//undefined
console.log(Object.isFrozen({}));//false
//默认对象是可扩展的,也是非冻结的。
var obj=Object.preventExtensions({});
console.log(Object.isfrozen(obj));//true
//一个不可扩展的对象也是一个冻结对象
var obj1={x:1};
console.log(Object.isFrozen(obj1));//false
//一个非空对象默认也是非冻结
Object.preventExtensions(obj1);
console.log(Object.isFrozen(obj1));//false
delete obj1.x;
console.log(Object.isFrozen(obj1));//true

var obj2={x:1};
Object.prenventExtensions(obj2);
Object.defineProperty(obj2,'x',{writable:false});
console.log(Object.isFrozen(obj2));//false
//一个不可扩展的对象,但是拥有一个可写但不可配置的属性,依然是非冻结的
Object.defineProperty(obj2,'x',{configurable:false});
console.log(Object.isFrozen(obj2));//true
//将x变为不可配置


var obj3={x:1};
Object.preventExtensions(obj3);
Object.defineproperty(obj3,'x',{configgurable:false});
console.log(Object.isFrozen(obj3));//false
//如果一个不可扩展的对象,拥有一个不可配置但可写的属性,是非冻结的。
//将x变为不可写
Object.defineProperty(obj3,'x',{writable:false});
console.log(Object.isFrozen(obj3));//true

//如果一个不可扩展的对象拥有一个访问器属性,它也是非冻结的
var obj4={
    get test(){
        return 1;
    }
};
Object.preventExtensions(obj4);
console.log(Object.isFrozen(obj4));//false
Object.defineProperty(obj4,'test',{configurable:false});//true

var obj5={x:1};
Object.freeze(obj5);
console.log(object.isFrozen(obj5));//true
console.log(object.isSealed(obj5));//true
console.log(object.isExtensible(obj5));//false









默认对象是可扩展的,非冻结的。

一个不可扩展的对象也是一个冻结对象。

有属性的对象不是冻结对象。如果是空对象,那么既是不可扩展对象也是冻结对象

26

 

 

你可能感兴趣的:(JavaScript)