Object.defineProperty

Object.defineProperty是ES5规定的。

语法

Object.defineProperty(obj,prop,descriptor)

参数

obj 要定义属性的对象。

prop 要定义或修改的属性的名称或 Symbol

descriptor 要定义或修改的属性描述符。

返回值

被传递给函数的对象。

源码中使用

defineReactive(obj, key, val) {
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get() {
            return val
        },
        set(newVal) {
            if ( val === newVal ) {
                return
            }
            val = newVal
        }
    })
}

注意

1、为什么vue2.0对象增加或者删除属性,无法侦测到这个变化?
因为vue通过Object.defineProperty来将对象的key转换成getter/setter的形式来追踪变化,但getter/setter只能追踪一个数据是否被修改,无法追踪新增属性和删除属性。
为了解决这个问题,Vue提供了vm.set与vm.delete。

参考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

https://www.jianshu.com/p/8fe1382ba135

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容