记录高级js学习(八)面向对象编程-属性描述符

69 阅读2分钟

为对象添加属性的方法:Object.defineProperty(obj,prop,descriptor)

image.png

属性描述符分为:数据属性描述符存取属性描述符(vue2响应式原理)

image.png

常规声明obj以下属性均为true,用defineProperty的话均为false

image.png

Configurable影响属性的重新配置(限于defineProperty)和删除

Enumberable影响该对象属性的遍历,为false时遍历时该属性不显示

writable影响属性的写入,为false在非严格模式可通过obj修改不报错,但是实际上obj还是没改到

get:function(){} 为该属性设置监听事件,获取该属性值的时候触发,其return的值会作为该属性的值返回

set:function(){} 为该属性设置监听事件,设置该属性值的时候触发,参数为设置的值

如果在get中获取最新的属性值且不发生回调地狱,闭包设置一个变量存储最新值,也可以在原对象加个_sex私有属性存储最新的值,拿取的时候就不会调用sex的get方法

var obj = { 
    name:"李斯",
    age:15, 
} 
function foo(){ 
    let val; //形参本就是个变量,可直接使用 
    Object.defineProperty(obj,"sex", { 
        configurable:true,
        set:function(value){ 
            console.log('修改的值: ', value);
            val = value; 
        },
        get:function(){
            console.log("闭包保留最新的值:",val); 
            return val 
        } 
    }) 
} 
foo() 
var sex = obj.sex
obj.sex = "未知"
var sex1 = obj.sex

注意:在浏览器打印对象,展开后点击对应属性的...会调用其get方法

定义多个属性描述符 Object.defineProperties(obj,{ name:{ },age:{ }})

如果属性描述的configurable,enumerable均为真 那么可以简写成以下形式

image.png

获取属性描述符的方法

image.png

对象禁用的三种方法:

1.下图增加对象属性不会报错(严格模式会) ,只是加不上去了,用defineProperty加会报错。只允许修改和删除

image.png

2.Object.seal(obj) 封闭一个对象,不能增加新属性,不能删除不能修改配置,但是可以修改属性的值

3.Object.freeze(obj) 禁止修改对象(也不能增加删除)对象冻结后, 没有办法再解冻, 只能通过克隆一个具有相同属性的新对象, 通过修改新对象的属性来达到目的