object.defineproperty&&object.keys
/*
Object.defineProperty:
给一个对象添加或者修改属性 返回一个对象
参数1:目标对象
参数2:需要修改或者添加的属性
参数3:当前属性的一些特征 对象
value: 设置属性值
writable: 设置当前属性是否允许被修改
configurable:设置当前属性是否可以删除
enumerable:设置当前属性是否可被枚举
getter---get() 当获取属性值的时候触发的函数
setter---set() 当设置属性的时候触发的函数
如何模拟ES6的const?
//value
var obj = {};
Object.defineProperty(obj,"name",{
value:"宋磊"
})
console.log(obj.name)
//writeable
var obj = {};
Object.defineProperty(obj,"name",{
value:"宋磊",
writable:false
})
obj.name="王多";
console.log(obj.name)
//configurable
var obj = {age:19};
Object.defineProperty(obj,"name",{
value:"宋磊",
configurable:false
})
delete obj.age;
delete obj.name;
console.log(obj)
enumerable:
var obj = {name:"宋磊",age:20};
Object.defineProperty(obj,"sex",{
value:"男",
enumerable:true
})
for(var key in obj){
console.log(key);
}
var obj = {name:"宋磊",age:20};
Object.defineProperty(obj,"sex",{
value:"男",
enumerable:true
})
console.log(Object.keys(obj))
Object.keys:把当前对象的属性枚举出来 返回值是一个数组
for in 与 Object.keys 的区别
前者可以把原型对象身上的属性枚举出来
后者不能把原型对象身上的属性枚举出来
function Fn(){}
Fn.prototype.type="人类";
var obj = new Fn();
obj.name = "宋磊";
obj.age = 20;
obj.sex = "男";
for(var key in obj){
console.log(key)
}
console.log(Object.keys(obj))
*/
//当使用get set方法的时候不允许使用value和writeable不然会报错
/*
数据劫持
当获取或设置的时候会劫持到新的值
*/
var obj = {name:"宋磊"};
Object.defineProperty(obj,"name",{
configurable:true,
enumerable:true,
get:function(){
console.log("获取了")
},
set:function(newStr){
console.log("设置了新值"+newStr)
}
})
obj.name;
obj.name = "王多";