Javascript 无法更新ES6中的类属性
这如何转化为ES6Javascript 无法更新ES6中的类属性,javascript,ecmascript-6,prototype,Javascript,Ecmascript 6,Prototype,这如何转化为ES6 函数Mock(){}; Mock.prototype.foo='bar'; var obj=新的Mock(); 控制台日志(obj.foo); Mock.prototype.foo='Something other'; 控制台日志(obj.foo) 因为在ES6中,类的.prototype属性是不可写的 而且不可配置 如果要更改,请使用Object.defineProperty 类模拟{ foo='bar' } const obj=新模拟() console.log(o
函数Mock(){};
Mock.prototype.foo='bar';
var obj=新的Mock();
控制台日志(obj.foo);
Mock.prototype.foo='Something other';
控制台日志(obj.foo)代码>
- 因为在ES6中,类的.prototype属性是不可写的
而且不可配置
- 如果要更改,请使用Object.defineProperty
类模拟{
foo='bar'
}
const obj=新模拟()
console.log(obj.foo)
Object.defineProperty(obj,'foo'{
价值观:“其他东西”,
可写:对,
可枚举:false,
可配置:false
})
console.log(obj.foo)
- 因为在ES6中,类的.prototype属性是不可写的
而且不可配置
- 如果要更改,请使用Object.defineProperty
类模拟{
foo='bar'
}
const obj=新模拟()
console.log(obj.foo)
Object.defineProperty(obj,'foo'{
价值观:“其他东西”,
可写:对,
可枚举:false,
可配置:false
})
log(obj.foo)
对我来说,更改原型似乎是一种反模式。但是,如果您确实想要这样做,您应该继续使用与以前相同的语法来定义属性:
类模拟{}
Mock.prototype.foo=“bar”;
const obj=新模拟();
控制台日志(obj.foo);
Mock.prototype.foo=“其他东西”;
控制台日志(obj.foo)代码>对我来说,更改原型似乎是一种反模式。但是,如果您确实想要这样做,您应该继续使用与以前相同的语法来定义属性:
类模拟{}
Mock.prototype.foo=“bar”;
const obj=新模拟();
控制台日志(obj.foo);
Mock.prototype.foo=“其他东西”;
控制台日志(obj.foo)代码>您可以从protoconsole.log(obj.\uu proto\uu.foo);/'访问父foo其他的东西“
@DenisStukalov如果我只有一个关于Mock
的参考怎么办?@DenisStukalov,最好不要建议使用不推荐的property@ChristopherRonning这会有什么帮助?我想更新原型
,这样它也会更新所有对象instances@GuerricP类字段是一个实验性的语法。它们可能成为ES2021或更高版本的一部分(如果有的话)。在ES6中,您只需编写一个构造函数()
来创建属性,这也清楚地表明它们是在实例上创建的。您可以从protoconsole.log(obj.\uu proto\uu.foo);/”访问父foo其他的东西“
@DenisStukalov如果我只有一个关于Mock
的参考怎么办?@DenisStukalov,最好不要建议使用不推荐的property@ChristopherRonning这会有什么帮助?我想更新原型
,这样它也会更新所有对象instances@GuerricP类字段是一个实验性的语法。它们可能成为ES2021或更高版本的一部分(如果有的话)。在ES6中,您应该编写一个构造函数()
来创建属性,这也清楚地表明它们是在实例上创建的。如果是反模式,为什么允许这样做?与传统web的向后兼容性?这是一个有趣的问题,但这将由tc39小组来回答。无论如何,语言规范永远不可能消除所有的反模式。好的,我认为这是解决这个问题的一个好方法:。这可能超出了问题的范围,但您将如何解决它?使用代理
?还有什么吗?这是允许的,因为很难阻止它。如果需要,覆盖方法也是非常有用的。将原型对象视为可变存储仍然是个坏主意。如果它是反模式,为什么允许它?与传统web的向后兼容性?这是一个有趣的问题,但这将由tc39小组来回答。无论如何,语言规范永远不可能消除所有的反模式。好的,我认为这是解决这个问题的一个好方法:。这可能超出了问题的范围,但您将如何解决它?使用代理
?还有什么吗?这是允许的,因为很难阻止它。如果需要,覆盖方法也是非常有用的。将原型对象视为可变存储仍然是个坏主意。