在js中,我创建了一个对象。我想向对象的原型添加一个新属性,该属性将因实例而异。
现在添加价值,我使用了get。但这给了我错误。我在下面添加了代码。

我该怎么做?

我用谷歌搜索。我所学到的就是让它们为现有财产增加价值。但是我想为新属性增加价值,这将因实例而异。



var computer = function (name, ram) {
    this.name = name;
    this.ram = ram;
};

Object.defineProperty(computer.prototype, "graphic", {
    set: function graphic(value) {
        this.graphic = value;
    },
    get: function graphic() {
        return this.graphic;
    },
});

var vio = new computer("sony", "8gb");


vio.graphic = "gtx980";

console.log(vio.graphic);





错误信息:

enter image description here

最佳答案

重读您的问题,我会回答您的实际担忧:

当您将事物放到原型上时,它们将在所有实例之间共享(就像您以Java之类的经典语言将它们添加到类中一样)。
将事物放在this上时,它们仅可用于特定实例。

以下作品,没有setter或getters:

function Computer(name, ram) { // Please use Capital names for constructors
    this.name = name;
    this.ram = ram;
};

let vio = new Computer('sony', '8gb');
vio.graphic = 'gtx980';


graphic属性仅对于vio中保留的实例存在,而不存在于其中的每个计算机实例。

另一方面,如果您要这样做:

function Computer(name, ram) {
  this.name = name;
  this.ram = ram;
}

Computer.prototype.graphic = 'gtx980';

// All instances of Computer will now have a .graphic with the value of 'gtx980'.




出现错误的原因是,您为graphic定义了一个setter,在其中,您试图分配给graphic,从而调用graphic的setter,而该setter试图分配给graphic ....你明白了。

解决方案是将实际变量的名称更改为(例如_graphic)。



var computer = function (name, ram) {
    this.name = name;
    this.ram = ram;
};

Object.defineProperty(computer.prototype, "graphic", {
    set: function graphic(value) {
        this._graphic = value;
    },
    get: function graphic() {
        return this._graphic;
    },
});

var vio = new computer("sony", "8gb");


vio.graphic = "gtx980";

console.log(vio.graphic);





请注意,JS实际上并没有私有变量。您将无法阻止某人更改_graphic

10-08 15:56