Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法更新ES6中的类属性_Javascript_Ecmascript 6_Prototype - Fatal编程技术网

Javascript 无法更新ES6中的类属性

Javascript 无法更新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

这如何转化为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(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)您可以从proto
console.log(obj.\uu proto\uu.foo);/'访问父foo其他的东西“
@DenisStukalov如果我只有一个关于
Mock
的参考怎么办?@DenisStukalov,最好不要建议使用不推荐的property@ChristopherRonning这会有什么帮助?我想更新
原型
,这样它也会更新所有对象instances@GuerricP类字段是一个实验性的语法。它们可能成为ES2021或更高版本的一部分(如果有的话)。在ES6中,您只需编写一个
构造函数()
来创建属性,这也清楚地表明它们是在实例上创建的。您可以从proto
console.log(obj.\uu proto\uu.foo);/”访问父foo其他的东西“
@DenisStukalov如果我只有一个关于
Mock
的参考怎么办?@DenisStukalov,最好不要建议使用不推荐的property@ChristopherRonning这会有什么帮助?我想更新
原型
,这样它也会更新所有对象instances@GuerricP类字段是一个实验性的语法。它们可能成为ES2021或更高版本的一部分(如果有的话)。在ES6中,您应该编写一个
构造函数()
来创建属性,这也清楚地表明它们是在实例上创建的。如果是反模式,为什么允许这样做?与传统web的向后兼容性?这是一个有趣的问题,但这将由tc39小组来回答。无论如何,语言规范永远不可能消除所有的反模式。好的,我认为这是解决这个问题的一个好方法:。这可能超出了问题的范围,但您将如何解决它?使用
代理
?还有什么吗?这是允许的,因为很难阻止它。如果需要,覆盖方法也是非常有用的。将原型对象视为可变存储仍然是个坏主意。如果它是反模式,为什么允许它?与传统web的向后兼容性?这是一个有趣的问题,但这将由tc39小组来回答。无论如何,语言规范永远不可能消除所有的反模式。好的,我认为这是解决这个问题的一个好方法:。这可能超出了问题的范围,但您将如何解决它?使用
代理
?还有什么吗?这是允许的,因为很难阻止它。如果需要,覆盖方法也是非常有用的。将原型对象视为可变存储仍然是个坏主意。