一个疑问
set,get 用于定义一个属性的返回值,输入值.
能不能用 set,get 模拟 普通变量的取值赋值?
第一种思路,
let _age = 18;
let obj = {
get age () {
return _age
},
set age (value) {
_age = value
}
}
但这样做, 就必须有另一个变量_age 存在.
有没有办法, 不需要这个_age,也能实现?
第二种思路是, 我每次 set的时候, 直接重写一次这个对象的方式,
重写一次get,
let obj = {
get age () {
return 18
},
set age (value) {
obj = {
get age () {
return value
},
set age (value) {
}
}
}
}
但很明显这是不行的, 且不说动作太大,
这只能完成有限次的更改.
有必要深入了解一下set,和get
理解Object.defineProperty的作用
然后就明白, set,get 是这个描述对象里的属性
第三种,修改 描述属性
let obj = {
get age() {
return 18
},
set age(value) {
先获取原先的描述属性
let des = Object.getOwnPropertyDescriptor(obj, 'age');
然后重写一遍 get
Object.assign(des, {
get() {
return value
}
});
更改描述属性
Object.defineProperty(obj, 'age', des);
}
}
发现其实没必要assign
let obj = {
get test () {
return "mike"
},
set test (value) {
Object.defineProperty(obj,"test",{
get () {
return value
}
});
}
}
疑问, set,get 更够被继承吗?
let a = 18;
let obj = {
get test () {
return a
},
set test (value) {
a = value
},
name : 'mike'
}
let objson = Object.create(obj);
console.log(obj.test);// 18
obj.test = 22;
console.log(obj.test);// 22
console.log(objson.test);// 22
objson.test = 32;
console.log(obj.test);// 32
console.log(objson.test);// 32
- 表明确实能够继承
- 子对象修改 会影响 父对象
- 实际上这很奇怪,因为子对象与父对象,共享一个test
- 并且你会发现, 子对象无法通过 objson.test 的方式生成自己的属性了.也就是无法覆盖!
- 这也是一种神奇的污染.
再看一下这个
let _age = 18;
class aa {
constructor() {
this.name = "mike";
}
get age () {
return _age
}
set age (value) {
_age = value
}
}
let b = new aa();
let c = new aa();
let _age = 18;
class aa {
constructor() {
this.name = "mike";
}
get age () {
return _age
}
set age (value) {
_age = value
}
}
let b = new aa();
let c = new aa();
console.log(b.age);/18
console.log(c.age);/18
b.age = 20;
console.log(b.age);/20
console.log(b.age);/20
c.age = 30;
console.log(b.age);/30
console.log(b.age);/30
从继承的角度上来看, 确实都能继承,
并且都会影响父级和全部的实例
问题在于污染了 age 这个属性
所有的实例无法设置自己专有的 age
也就是说,一定会影响全部实例.
所以如果遇到一个属性怎么设置都无法查看,
有可能就是get set 搞的.
网友评论