Object.defineProperty()方法的使用

用途:

定义对象中的新属性或修改对象的原有属性

语法:

Object.defineProperty(obj,prop,descriptor)   

注:三个参数都必须有

(1)obj表示目标对象 

(2)prop表示需要定义或修改属性的名字

(3)descriptor表示目标属性所拥有的特性

第三个参数descriptor说明:

value:设置属性的值
writable:值是否可以被重写。true|fale   //false表示不允许修改属性值
enumerable:是否遍历某个属性。true|fale   //默认值为false
configurable:目标属性是否可以被删除或是否可以再次修改特性。 true|false 

代码示例:

var star = {
    name: "zhangsan"
};
Object.defineProperty(star, "name", {
    value: "lisi"
})
console.log(star); // {name:"lisi"}

通过value值修改属性值

var star ={name:"zhangsan"};

Object.defineProperty(star,"name",{
    writable:false;
})

console.log(star); // {name:"zhangsan"}

star.name = "lisi";

console.log(star); // {name:"zhangsan"}

通过writable属性设置name属性是否可以被重写,默认值false为不能重写

var star ={name:"zhangsan"};

Object.defineProperty(star,"age",{
    value:18,
    enumerable:false,
})

for (var i in star) {
    console.log(star[i])
} //zhangsan

通过enumerable属性设置age属性是否可以被遍历,默认值false为不能被遍历

var star ={name:"zhangsan"};

Object.defineProperty(star,"age",{
    value:18,
    configurable:false,
})

delete star.age;

console.log(star); // {name:"zhangsan",age:18}

通过configurable属性设置age属性是否可以被删除,默认值false为不能被删除

进阶教程

数据代理:通过一个对象代理对另一个对象中的属性的操作(读/写)

需求:通过obj2实现对obj1的修改

let obj1 = {x: 100};
let obj2 = {y: 1000};

Object.defineProperty(obj2, "x", {
    //get用于读取或创建x属性,并且值为obj1的x属性值
    get() {
        return obj1.x
    },
    //set函数用于修改属性,调用set函数意味着obj2的x属性值被修改
    set(value) {
        obj1.x = value
    }
})

console.log(obj2); //{y:1000,x:100}

Vue中的数据代理

通过vm对象来代理data对象中的属性的操作

基本原理:

(1)通过Object.defineProperty()方法把data对象中所有的属性添加到vm身上

(2)为每一个添加到vm身上的属性,都指定一个getter和setter

(3)在geter和setter内部操作data中对应的属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值