在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
。