es5中Object.defineProperty()

// 此方法可以直接在一个对象上定义一个新的具有详细描述的属性,或者修改一个现有属性,并返回这个对象。
                    // value writable configurable enumerable 是数据描述符。get set 是存取描述符
            //切记:描述符中同时出现value,writable和 set get的时候会出错 不要一起用
            //作用:双向数据绑定的核心方法。做数据劫持的操作

            //举例:
            var a = 1;
            delete window.a;
            console.log(a);//1  var的全局变量不可删除 说明configurable==false

            b = 1;
            delete window.b;
            //console.log(b);//Uncaught ReferenceError: b is not defined  不var(暗示)的全局变量可以删除 说明configurable==true

            for(var prop in Object.prototype){
                console.log(prop);//什么也不输出 说明Object.prototype中的属性是不可以枚举的。 enumerable==false
            }

            //操作:
            //
            var obj = {
                age:18 //当直接在obj里写的时候,这个属性直接就是可读,可写,可配置,可枚举的。所以可以被Object.defineProperty()重新定义
            };
            Object.defineProperty(obj,'name',{
                value:'wy',
                writable:false, //值可不可以被修改 默认false
                configurable:true, //值可不可以被删除 默认false
                enumerable:true //该属性可不可以在遍历中被遍历出来 默认false
            });

            //getter 和 setter
            var obj1 = {};
            var tempValue = 'wangye';
            Object.defineProperty(obj1,'name',{
                configurable:true,
                enumerable:true,
                get:function(){//不可以与value并存  !!:取值的时候触发
                    return tempValue;
                },
                set:function(newValue){//不可与writable并存  !!:改值得时候触发
                    tempValue = newValue;
                }
            });


            //getter 和 setter的简单写法
            var obj2 = {
                tempValue:'simple',
                get name(){
                    return this.tempValue;
                },
                set name(newValue){
                    this.tempValue = newValue;
                }
            };

 

你可能感兴趣的:(es5)