function defineReactive(obj, key, val) {
Object.defineProperty(obj, key, {
get: function () {
return val;
},
set: function (newVal) {
val = newVal;
console.log('值已被修改,现在为 ' + newVal);
}
})
}
var p1 = {
name: 'z',
age: 21,
sex: 'male'
};
defineReactive(p1, 'age', p1.age);
执行以后
几点疑惑
1、这个返回值是哪里来的?是set函数默认添加的吗
2、JS中函数都是值传递,如果传的是一个基本值类型而不是一个引用类型的话,函数内部形参的改变是不会影响到函数外面的实参的。为什么执行了p1.age = 99 以后,再执行p1.age 能正确取到99呢,这个99存在哪里。。。想了好久都没能理解.... 而且定义get的时候,return val 应该就是 return 21了吧,
我的理解就是一下这两段代码是等价的,因为val参数是一个值类型,所以就是相当于return 21
function defineReactive(obj, key, val) {
Object.defineProperty(obj, key, {
get: function () {
return val;
},
set: function (newVal) {
val = newVal;
console.log('值已被修改,现在为 ' + newVal);
}
})
}
我的理解上面这段代码和下面这段代码等价
function defineReactive(obj, key, val) {
Object.defineProperty(obj, key, {
get: function () {
return 21;
},
set: function (newVal) {
val = newVal;
console.log('值已被修改,现在为 ' + newVal);
}
})
}
但实际是为什么set以后,get会改变呢,这个形参val到底经历了什么?
1 function defineReactive(obj, key, val) {
2 Object.defineProperty(obj, key, {
3 get: function () {
4 return val; // ②
5 },
6 set: function (newVal) {
7 val = newVal; // ①
8 console.log('值已被修改,现在为 ' + newVal);
9 }
})
}
var p1 = {
name: 'z',
age: 21,
sex: 'male'
};
defineReactive(p1, 'age', p1.age);
可能说的不是很明白,刚学这一块,希望得到满意的解答,谢谢~~
理解有点偏差,主要利用的是闭包来保存值,如果不理解闭包,建议先去了解一下。
由于get和set属性都是一个函数,利用闭包存储到了val的值,可以理解为得到了一块内存指向,值就是val的值,所以经过set函数之后,val的值被改变了,所以你通过get通过val找到的值就是被改变之后的值。
defineProperty之后,p1的age属性就已经被重写,之所以跟21相关,也只是设置的时候传入p1.age初始值21,所以不应该执着于21