JavaScript中防篡改对象

JavaScript中防篡改对象

测试:Chrome
前言:ECMAScript5中增加了指定对象的行为,在这之前我们先看看如何手动设置属性的‘Configurable’、‘Writable’、‘Enumerable’、‘Value’、‘Get’、‘Set’—这些通过字面意思大家应该也能理解的,就不多说了,下面举一个例子:(要用到对象的.defineProperty()这个方法)

Object.defineProperty(person,'name',{writable:false,value:'zs'})
    alert(person.name)//zs
    person.name = 'ls';
    alert(person.name)//zs

var person = { name: “somjor” };
1. preventExtensions(不可扩展对象)

 var person = { name: "somjor" };
Object.preventExtensions(person);
//不能给person对象添加新属性和方法了;

person.age = 29;
alert(person.age); //undefined
//但是你还可以对原来的属性进行修改删除;

person.name = 'ls'
    alert(person.name)//ls
delete person.name
alert(person.name)//undefined

//使用isExtensible可以判断对象是否可以扩展
alert(Object.isExtensible(person))//false
2. seal(密封对象)
2.1. 密封对象不可扩展,而且已有成员的‘configurable’被设置成了false,意味不能删除属性和方法,但可以修改的
var person = { name: "somjor" };
    Object.seal(person);
    person.age = 29;
    alert(person.age); //undefined

    person.name = 'ls'
    alert(person.name)//ls

    delete person.name
    alert(person.name)//ls

    alert(Object.isExtensible(person))//false
    //使用isSealed可以判断对象是否被密封了;
    alert(Object.isSealed(person))//true;
3. freeze(冻结对象)
3.1. 冻结的对象既不可扩展,又是密封的,而且对象

数据属性的 [[Writable]] 特性会被设置为 false 。 如果定义 [[Set]] 函数, 访问器属性仍然是可写的。(后面这句在书上看的!!!)

 var person = { name: "somjor" };
    Object.freeze(person);
    person.age = 29;
    alert(person.age); //undefined

    person.name = 'ls'
    alert(person.name)//somjor

    delete person.name
    alert(person.name)//somjor

    alert(Object.isExtensible(person))//false
    alert(Object.isSealed(person))//true

    Object.defineProperty(person,'_name',{
//        get:function(){return name},
        set:function(newname){ this.name=newname}
    })
    person._name='zhangsan';
    alert(person.name)//Cannot define property:_name, object is not extensible.
//不知道是不是我写错了还是怎么,还是不能修改。如果把Object.freeze(person)注释掉就可以了。

//可以用 isFrozen判断对象是否冻结;
alert(Object.isFrozen(person))//true;


区别:preventExtensions:不能扩展,但可以对原有的属性进行修改,删除;
seal:不能扩展,删除,但可以对原有的属性进行修改;
freeze:不能扩展,删除,修改;

发布了80 篇原创文章 · 获赞 9 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章