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:不能扩展,删除,修改;