如何从对象访问默认的类属性?

时间:2020-03-15 09:20:19

标签: javascript class ecmascript-6

我面临以下挑战,即我没有成功。我找不到一个碰到相同问题的人的例子。

class MyClass {
    name = 'default name'
}

let instance = new MyClass();
instance.name = 'new name';

# At this point I want to be able to access the default 'name' of my class (value: 'default name')

我很好奇如何做到最好。

3 个答案:

答案 0 :(得分:3)

如其他答案所述,没有简单的方法,您必须创建一个新实例。

但是,如果您更经常需要此实例,则可以创建一次实例并重新使用它:

class MyClass {
  name = 'default name'
}

MyClass.prototype.defaults = Object.freeze(new MyClass())

// ------------

let instance = new MyClass()
instance.name = 'new name'
console.log(instance.name) // new name
console.log(instance.defaults.name) // default name

我还使用Object.freeze来防止对默认实例的意外修改。

您还可以分配给MyClass.defaults,但是随后您必须使用instance.constructor.defaults.nameMyClass.defaults.name

答案 1 :(得分:2)

给出问题恰好中的代码,除非创建新实例,否则不可能。与

name = 'default name'

您分配给实例对象的name属性。然后用

instance.name = 'new name';

您覆盖了实例对象的name属性。 'default name'不再存在于原型链的任何地方。

因此,创建一个新实例以再次运行class字段:

class MyClass {
    name = 'default name'
}

let instance = new MyClass();
instance.name = 'new name';

const newInstance = new MyClass();
console.log(newInstance.name);

更好的模式是将默认值放在 prototype 上。这样,您可以检查原型上的属性或实例上的属性:

class MyClass {
    
}
MyClass.prototype.name = 'default name';

let instance = new MyClass();
instance.name = 'new name';

console.log(instance.name);
console.log(MyClass.prototype.name);

答案 2 :(得分:1)

您可以创建一个新的临时实例并获取名称

class MyClass {
    name = 'default name'
}

let instance = new MyClass();
instance.name = 'new name';

console.log((new MyClass()).name)