javascript - 函数参数传值,如何通过Object.defineProperty劫持一个对象的属性

标签 javascript vue.js

当我学习 Vue 中的 react 性时,如果函数参数传递值,我无法理解 react 性是如何实现的。

//实际代码

var obj = {a: 'aa'}
function reactive(obj, key, value) {
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get() {
            return value
        },
        set(val) {
            value = val
        }
    })
}
function observe(obj) {
    Object.keys(obj).map((key, index) => {
        reactive(obj, key, obj[key])
    })
}
observe(obj)
obj.a //'aa'
obj.a ='bb' //'bb'

//错误码

var obj = {a: 'aa'}
function reactive(obj, key) {
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get() {
            return obj[key]
        },
        set(val) {
            obj[key] = val
        }
    })
}
function observe(obj) {
    Object.keys(obj).map((key, index) => {
        reactive(obj, key)
    })
}

observe(obj)
obj.a //VM1649:6 Uncaught RangeError: Maximum call stack size exceeded

当我通过 'obj[key]' 设置值时,它给出了一个 RangeError

//示例代码

var obj = {a: 'aa'}
function reactive(obj, key, value) {
   value = 'bb'
}
function observe(obj) {
    Object.keys(obj).map((key, index) => {
        reactive(obj, key, obj[key])
    })
}
observe(obj)
obj.a //'aa'

但是,示例代码显示,我们不能通过求值来改变对象的值

最佳答案

错误代码中,当你尝试获取obj[key]时,会一次次触发obj[key]的getter,所以就是这个原因超出最大调用堆栈大小 显示。以正确的方式,您应该将值作为函数 reactive 中的第三个参数传递。

关于javascript - 函数参数传值,如何通过Object.defineProperty劫持一个对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58514626/

相关文章:

vue.js - 向父级发送下拉值

javascript - 每次向上或向下滚动时,Wow.js 都会重复动画

javascript - 关于 JSLint 报告的语法错误的困惑

php - jquery ui 自动完成导致标题错误

javascript - 如何在Vue中传递函数参数以使用axios发出GET请求?

vue.js - vue-router 既不监视路由也不监视导航守卫开火

class - VueJS - 如何从 v-for 创建的对象绑定(bind)多个类?

javascript - 从 HTML 创建的 DraftJS 编辑器不起作用

Javascript 在 asp.net 内容页面中不起作用

javascript - Vue.js/Firebase登录认证接口(interface)设置route-guard