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