美文网首页
JavaScript方法中的Object.definePrope

JavaScript方法中的Object.definePrope

作者: jhonphy | 来源:发表于2018-10-06 15:20 被阅读0次

Object.defineProperty是一个作用强大的方法。凡能够实现双向绑定的MVVM框架都是基于此方法!defineProperty的翻译即是“定义属性”,它不仅仅可定义属性,还可通过它来对属性进行拦截、监听。

一、了解对象

1.字面量定义属性和属性值

var obj={
    userName:"tom",
    age:12
};
console.log(Object.keys(obj));//['userName','age']

2.字面量定义增加属性和属性值

var obj1={

};

obj1.userName="alice";
obj1.age='13';
var str="age";
console.log(obj1.userName);//alice
console.log(obj1[str]);//13

3.通过Object.defineProperty增加属性和属性值

var obj2={
    age:23,
};
Object.defineProperty(obj2,"userName",{
    value:"tack",
    writable:true,      //是否允许定义的属性被修改,默认false;true的情况下字面量里面定义的属性是可以修改的(如age)
    enumerable:true,    //是否允许定义的属性被枚举,在遍历(如for循环、console.log(obj,Object.keys[obj])时用到的就是枚举;默认false;
    configurable:true,  //是否允许被删除和被重置(即前后两次通过defineProperty定义同一个属性),默认是false;
});                     //返回值是目标对象(即obj2),如果已经定义了userName属性,会覆盖掉前面的属性值
console.log(obj2.userName,obj2.age);//tack 23
obj2.userName="jack";
console.log(obj2.userName);         //jack
for (var key in obj2){
    console.log(key,obj2[key])
};
delete obj2.userName;//允许删除的情况下回删除obj2的userName属性
console.log(obj2.userName); //undefined

二、认识Object.defineProperty

var obj3={

};
var obj4={

};
//A
Object.defineProperty(obj3,"userName",{
    get(){//get是读取数据,即在对obj3进行读取数据(如console.log(obj)、遍历等操作)的时候会触发该函数
        console.log("执行了get");
        return "rose";//该返回值会赋值给属性userName;
    },
    set(){

    }
});
console.log(obj3.userName);//执行了get  rose//执行该输出时会触发get()方法,若get()方法中没有返回值,则为undefined;
//B
var userName=null;
Object.defineProperty(obj4,"userName",{
    get(){
        return userName;
    },
    set(v){//set可以接受参数
        userName=v;
    }
});
console.log(obj4.userName);//null
obj4.userName="mack";//执行该输出时会触发set()方法,会将"mack"作为参数传给set(),
console.log(obj4.userName);//mack
//执行过程是修改属性值得操作会触发set()方法,set方法会把参数赋值给变量userName,之后的读取操作会触发get()方法,会把变量userName的值赋值给obj4的属性userName

三、使用Object.defineProperty

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Study</title>
</head>
<body>
<input type="text"/>
<p></p>
</body>
<script>
    var inp=document.querySelector("input");
    var p=document.querySelector("p");
    var obj={

    };
    Object.defineProperty(obj,"userName",{
        set(v){
            inp.value=p.innerHTML=v;//双向绑定
        },
        get(){
          return p.innerHTML;
        }
    });
    inp.onkeyup=function () {
        obj.userName=this.value
    }
</script>
</html>

相关文章

网友评论

      本文标题:JavaScript方法中的Object.definePrope

      本文链接:https://www.haomeiwen.com/subject/iqshaftx.html