Object.defineProperty

Object.defindPorperty 可以限制属性的更改,监听属性的赋值和获取,vue2就是基于此特性实现的数据同步更新到视图,所以vue2不会支持ie8

/*
es5新增
var obj Object.create(prototype,[object])
第一次参数是表示创建对象的原型:即obj.__proto__=prototype
第二次参数是给对象添加属性:{
height:{
value:"xxx",//值
writable:"false",//是否可写
enumerable:"false",//是否可枚举
configurable:"false",// 是否可配置 ,false表示不可以delete,并且不可以通过Object.defineProperty来更改属性,value除外
}
} 默认全是false,即不可枚举,不可写,不可了再通过Object.defineProperty进行配置和delete

// es3就有 ie 8 但是使用不了
Object.defineProperty(obj,propertyName,config)
1.要更改的对象
2.属性名
3.配置{
value:"xxx",//值
writable:"false",//是否可写
enumerable:"false",//是否可枚举
configurable:"false",// 是否可配置 ,false表示不可以delete,并且不可以通过Object.defineProperty来更改属性,value除外
get:function(){}
set:function(v){} // ie9+支持
}

*/

/* var pepole = {name:"muyi",age:24};
var muyi = Object.create(pepole,{height:{value:175,enumerable:"true"}});
muyi.height=178;
//delete muyi.height;
for (var i in muyi)
{

console.log(i+" "+muyi[i]);


}
*/
// Object.defineProperty(muyi,"height",{
// value:175
// })
// for (var i in muyi)
// {
// if(muyi.hasOwnProperty(i)){
// console.log(i+" "+muyi[i]);

// }
// }

(function(){

// 设置了属性获取和设置的监听
var obj = {a:1,b:2};
Object.defineProperty(obj,"a",{
set:function(v)
{
this._a = v;

console.log("设置了a"+v);
},
get:function()
{

console.log("获取了a");
// return this.a;
return this._a;
}

})

obj.a=12;
console.log(obj.a)


})()

原文地址:https://www.cnblogs.com/chillaxyw/p/9009949.html