我使用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);

最佳答案

您将返回一个具有两个属性defaultLocationx的对象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.ydefaultLocation.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);

10-06 08:55