defineProperty详解

搁置了几天我还是决定再次重写!

下边我们来具体聊聊先从defineProperty开始说起

defineproperty

//defineproperty 有个定义object属性的功能,应该没几个人用,因为相对于obj.a = 1这种方式简直不能再难用。

//通常我们定义obj属性
let obj = {
      a:1
}
obj.b = 2
obj['c'] = 3
console.log(obj)//{a: 1, b: 2,c: 3}  

Object.defineProperty(obj,'d',{
      value: 4
})

console.log(obj)//{a: 1, b: 2,c: 3,d:4}  //defineProperty可以定义对象属性

//也可以修改
Object.defineProperty(obj,'b',{
      value: 5
})
console.log(obj)//{a: 1, b: 5, c: 3, d: 4}

//对你没看错defineProperty有这个功能,不知可以定义新的属性还可以修改,这么逆天难用的功能为什么还要造出来?说这个有什么用?别急往下看

descriptor详解

defineProperty 接收三个参数
  • object (必须有 操作的对象本身 这个很容易理解不传它操作谁?)

  • propertyname (必须有 属性名 添加修改属性得有属性名)

  • descriptor (必须有 官方说的我理解不了,我理解的是 属性描述
    1、简单点就是 设置属性的值value,
    2、是否可操作属性值 writable,
    3、是否可修改配置configurable如果值为false descriptor内的属性都不可操作
    4、是否可枚举enumerable

    *descriptor内配置可有可无,value默认undefind,其余默认为false

先做了介绍我们下边来证明下

writable
//栗子还是这个栗子
        let obj = {
            a: 1
        }
        Object.defineProperty(obj, 'b', {
            value: 2,
            writable: false//不可修改
        })

        obj.b = 3
        console.log(obj) //{a: 1, b: 2} 还真是不可以
        //难道是姿势不对?
        Object.defineProperty(obj, 'b', {
            value: 3
        })
        console.log(obj)//{a: 1, b: 2} 一样的效果 和姿势无关。

configurable

//configurable 这个比较厉害 控制descriptor内属性都不可改变不知道是不是真的

//还是这个栗子

       let obj = {
            a: 1
        }
        Object.defineProperty(obj, 'b', {
            value: 2,
            //writable: false//不可修改
            configurable: false
        })
        obj.b = 5
        console.log(obj)//[1,2]
enumerable

对否可枚举

 let obj = {
            a: 1
        }
        Object.defineProperty(obj, 'b', {
            value: 2,
            //writable: false//不可修改
            //configurable: false
            enumerable: false
        })
        //obj.b = 5
        console.log(Object.keys(obj))//["a"]

接了下来说到重点: set和get这也是vue3.0前observe的实现原理

let obj = {
            a: 1
        }

        let newValue = 45
        Object.defineProperty(obj, 'b', {
            get(value) {
                console.log('获取')
                return value
            },
            set(newValue) {
                console.log('设置')
                value = newValue
            }
        })
        obj.b = 6 //设置

        obj.b //获取

知道用法了我们来实践一下

      //html
      <div></div>
      <input type="text">
      //js
      //类似 vue的data
        let obj = {}

        /*
         *obj      要劫持的对象
         *name     要劫持对象的属性
         *callback 劫持以后的操作
         */
        function watch(obj, name, callback) {
            let value = obj.name
            Object.defineProperty(obj, name, {
                set(msg) {
                    // 触发setter给obj赋值
                    value = msg
                        //执行劫持后的操作
                    callback(value)
                },
                get() {
                    //返回获取属性值
                    return value
                }
            })
        }

        //
        function doSomething(value) {
            document.querySelector('div').innerHTML = value
            document.querySelector('input').value = value
        }
        //监听input变化 
        //可以参考全兼容版:https://segmentfault.com/a/1190000017524278
        document.querySelector('input').addEventListener('input', (e) => {
            obj['msg'] = e.target.value
        })

        watch(obj, 'msg', doSomething)

效果:
1、input输入改变div内容


image.png

2、改变obj name属性


image.png

3、获取改变后的obj属性name
image.png

简单的用defineProperty实现了双向绑定

欢迎吐槽!您的点赞是我继续的动力!谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容