我使用getter仅查看我的私有财产,但是当我使用get时,我也可以更改对象。
我该怎么办??
function Circle(radius = 1) {
let number = radius;
this.draw = ()=> number;
let defaultLocation = {x: 0 , y: 0};
Object.defineProperty(this,"defaultLocation",{
get(){ return defaultLocation},
// set(value) {
// if (!value.x || !value.y)
// throw new Error('invalid location.');
// defaultLocation = value;
// }
})
}
const another = new Circle(2);
another.defaultLocation.x = 100 ;
console.log(another);
console.log(another.defaultLocation);
最佳答案
您将返回一个具有两个属性defaultLocation
和x
的对象y
。默认对象是可变的。使用getter返回对象不会使该对象不可更改。
您必须创建一个具有“不可变”属性的对象,然后返回该对象。
let defaultLocation = {};
Object.defineProperty(defaultLocation,"x", {
value: 0,
});
Object.defineProperty(defaultLocation,"y", {
value: 0,
});
Object.defineProperty(this,"defaultLocation",{
get(){ return defaultLocation}
});
这样,您不能通过诸如
defaultLocation.x
之类的分配来更改defaultLocation.y
和defaultLocation.x = 100;
值。这样,defaultLocation.x
仍将返回0
。如果要修改属性,可以通过在
Object.defineProperty
上再次调用defaultLocation
或使用另一个变量并修改该变量来进行:// Method 1 (more verbose and less performant)
Object.defineProperty(defaultLocation,"x", {
configurable: true,
value: 0,
});
console.log(defaultLocation.x);
Object.defineProperty(defaultLocation,"x", {
configurable: true,
value: 10,
});
console.log(defaultLocation.x);
// Method 2
let _x = 0;
Object.defineProperty(defaultLocation,"x", {
get: () => _x,
});
console.log(defaultLocation.x);
_x = 10;
console.log(defaultLocation.x);