是否可以在js中为对象的新属性添加值?

时间:2017-03-09 08:17:44

标签: javascript object get prototype

在js中我创建了一个对象。我想在对象的原型中添加一个新属性,属性将不同于实例。 现在为了增加价值,我使用获取。但它给了我错误。我已添加以下代码。

我怎样才能完成这件事?

我用Google搜索了这个。我所学到的只是通过获取,它们为现有属性增加了价值。但我想为新属性增加值,这会使实例与实例不同。



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

1 个答案:

答案 0 :(得分:1)

重读你的问题,我会回答实际问题:

当你把东西放在原型上时,它们在所有实例之间共享(就好像你用Java这样的经典语言将它们添加到类中)。 当你把东西放在this上时,它们只能用于特定的实例。

以下作品,没有制定者或吸气者:

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 1}}试图分配给调用的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