【发布时间】:2016-11-13 16:30:13
【问题描述】:
我在尝试 ES6 语法时发现我无法在类定义中定义原型属性或实例属性,为什么要禁止它?
我之前用的是MyClass.prototype.prop=1,下面用babel编译器试试ES7,还是不能定义prototype属性。
class MyClass{
prop=1;
static sProp=1;
}
我不认为定义实例属性有什么危险,我自己的浏览器游戏中有两种情况需要原型属性:
-
子类实例需要从基类继承相同的属性值:
var Building=function(){...} Building.prototype.sight=350; TerranBuilding.CommandCenter=...(CommandCenter extends Building) TerranBuilding.Barracks=...(Barracks extends Building)
所以 CommandCenter 和 Barracks 的建筑视野都与 350 相同。
new CommandCenter().sight===new Barracks().sight//All buildings have same sight
-
缓冲区效果覆盖原始属性并删除缓冲区
Marine.prototype.speed=20 var unit=new Marine() unit.speed===20//get unit.__proto__.speed 20 unit.speed=5//Buffer:slow down speed, unit.speed will override unit.__proto__.speed delete unit.speed//Remove buffer unit.speed===20//true, speed restore
所以我认为它应该添加一种设置原型属性的方法而不是完全禁止它,或者您可以提供一些其他解决方案来处理上述两种情况?
【问题讨论】:
-
你能用getter代替吗?
class MyClass{ get prop() { return 1;} } -
@JuanMendes 为每种单位类型定义了许多属性,例如大小、hp、mp 和损坏,为所有这些属性编写 get/set 很累;对于我的案例2,有时由于缓冲区效应,我需要覆盖默认属性值,并且可以通过删除 unit.prop 来删除该缓冲区以禁止覆盖默认 unit.__proto__.prop,您的 get/set 无法以简单的方式支持这一点。
-
在原型上具有原子值通常被认为是一种反模式。原型主要用于方法。在实例上保留原子值。
-
这不是 ES7,这是一个提案。
-
@torazaburo 我不知道为什么它会是一种反模式。原型适用于对象实例共享的任何东西。正如我所看到的,危险在于原型上有可变对象,因为您可以对其进行变异,并且该更改将反映在所有实例上。如果您在原型上有一个原语,并且您执行
this.prim = 5,这将在对象本身上设置一个值,并且不会影响原型上的值。请发布一个链接,解释为什么“它通常被认为是一种反模式”
标签: javascript ecmascript-6 babeljs