Object 的静态方法

再提一下什么是静态方法:
  静态方法:在类身上的方法,
  动态方法:在实例身上的方法

对 对象的属性 进行 防篡改处理

Object.defineProperties(obj, props)以及数据劫持效果
obj:被添加属性的对象
props:添加或更新的属性对象

给对象定义属性,
如果存在该属性,则用新定义的属性更新已存在的属性,
如果不存在该属性,则添加该属性。

如果是新添加的属性,一定要设置是否可枚举,不然为false
enumerable(是否可枚举):默认为false
writable(是否可写):默认为false
configurable:是否可删除delete

Object.defineProperty()
在对象上定义新属性,或修改对象现有属性,并返回该对象。

Object.defineProperty(obj, 属性名字, {设置属性})

例子1:防篡改处理

let obj = {
  name: 'xx',
  num: 0
};
Object.defineProperties(obj, {
  name:{
    value: 'yy', // 表示该属性(这里是name)的属性值,默认为undefined
    writable: false, // 是否可重新赋值,默认为 true
    enumerable: false, // 是否可遍历(枚举,通过for-in循环返回属性),默认为true
    configurable: false // 是否可删除(通过delete删除属性从而重新定义属性),默认为true
  },
  age:{
    value: 20,
    enumerable: true
  }
});
obj.age = 30;
console.log(obj.age); // 默认不可写,所以此处依然是  20
delete obj.name; // 此处删了一个不可删除的属性
console.log(obj.name); // 当然能显示 yy

例子2:数据劫持 效果

let obj = {
  num:4
};
let n = 2;
Object.defineProperty(obj,'num',{
  get:function(){ // 取 obj.num 属性时会触发 get 方法
    /*数据劫持*/
    // 当你获取这个属性的时候,会调用
    n += 2;
    return n;
  },
 set(val){ // 给 obj.num 赋值时会触发 set 方法
  // val 是给 obj.num 赋值时的那个值 
 }
});
console.log(obj.num < 5 && obj.num > 5);//true
/*
num即小于5,又大于,就是应为,第一次判断obj.num时num=(n+=2)=4,符合了第一个条件,此时的n=4。
读到第二个判断的时候,再次触发函数,此时n+=之后为6,又符合了第二个判断条件,所以出现了true
*/

对 对象自身进行 防 篡改处理

不可扩展对象

var person = { name: "Nicholas" };
Object.preventExtensions(person);
person.age = 29;
alert(person.age); // undefined
// 严格模式下,进行添加或者删除属性都会报错。非严格模式下,直接忽略。

使用Object.isExtensible()方法可以确认对象是否可扩展

var person = { name: "Nicholas" };
alert(Object.isExtensible(person)); // true

Object.preventExtensions(person);
alert(Object.isExtensible(person)); // false

密封的对象(不可扩展也不可删除)

var person = { name: "Nicholas" };
Object.seal(person);
person.age = 29; 
alert(person.age); // undefined
delete person.name;
alert(person.name) // "Nicholas"
// 严格模式下,进行添加或者删除属性都会报错。非严格模式下,直接忽略。

使用Object.isSealed()来确定对象是否被密封了,密封的对象同时不可扩展

var person = { name: "Nicholas" };
alert(Object.isExtensible(person)); // true
alert(Object.isSealed(person)); // false

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

冻结的对象(不可扩展、不可删除、不可修改)

var person = { name: "Nicholas" };
Object.freeze(person);
person.age = 29; 
alert(person.age); // undefined
delete person.name;
alert(person.name) // "Nicholas"
person.name = "Greg";
alert(person.name) // "Nicholas"
// 严格模式下,进行添加、删除、修改属性都会报错。非严格模式下,直接忽略。

使用Object.isFrozen()来确定对象是否被冻结了,冻结的对象同时不可扩展、不可删除

var person = { name: "Nicholas" };
alert(Object.isExtensible(person)); // true
alert(Object.isSealed(person)); // false
alert(Object.isFrozen(person)); // false

Object.seal(person);
alert(Object.isExtensible(person)); // false
alert(Object.isSealed(person)); // true
alert(Object.isFrozen(person)); // true
posted @ 2018-11-10 10:11  真的想不出来  阅读(554)  评论(0编辑  收藏  举报