原型上具有默认属性的es6类在traceur中抛出
es6 class with default property on prototype throws in traceur
我最近开始使用traceur,在原型上创建具有默认值的类时偶然发现了一个奇怪的行为。我想知道这是traceur中的一个bug,还是ES6类的预期行为?
class hasDefault {
setValue ( v ) {
this.v = v;
}
}
Object.defineProperty( hasDefault.prototype, "v", {
value : 5,
enumerable : true
});
let a = new hasDefault;
console.assert(a.v === 5);
a.setValue(2);
console.assert(a.v === 2);
在traceur REPL 中运行
当我试图设置只读属性"v"时,它抛出了一个错误,我无法将其分配给它。这没有意义,因为该属性是在原型上定义的,而不是在实例上定义的。此外,我无法让Error在密封/冻结/不可扩展的对象上抛出es5,而且据我所知,Proxies并没有在V8中实现,所以……它最初是如何抛出错误的?这不是编译时的错误。
我的主要兴趣不是"让它发挥作用",这是微不足道的。您所需要做的就是用等效的Object.defineProperty
替换this.v = v
。我主要想知道它是否以及为什么会这样做,以及通过为原型分配默认属性而不是将它们存储在每个实例上,在这个数据结构中是否存在超过内存增益的负面性能影响。
当我试图设置只读属性"v"时,它抛出了一个错误,我无法将其分配给它。这没有意义,因为该属性是在原型上定义的,而不是在实例上定义的。
是的,该属性是只读的,因为writable
属性默认为false
。当继承v
属性时,该属性对赋值也有效。
此外,我无法将该错误放入es5
你只需要使用严格模式,它就会做到:
"use strict";
var test = Object.create(Object.defineProperty({}, "v", {value: 5, enumerable: true}));
console.log(test.v) // 5
test.v = 1; // Unhandled Error: Invalid assignment in strict mode
如果使用仅指定value
而不是get
和set
的Object.defineProperty
定义属性,则使用data descriptor
(请参阅此处)。使用data descriptor
可以添加writable
属性来指定是否可以更改属性。默认情况下为writable=false
。
因此,如果只指定数据描述符的value
,而不指定writable: true
,则以后无法更改该属性。这种行为与ES6无关,因为Object.defineProperty
是在ES5中引入的。
正确代码:
class hasDefault {
setValue ( v ) {
this.v = v;
}
}
Object.defineProperty( hasDefault.prototype, "v", {
value : 5,
writable: true,
enumerable : true
});
let a = new hasDefault;
console.assert(a.v === 5);
a.setValue(2);
console.assert(a.v === 2);
Traceur REPL
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 加载自定义类在ExtJs中不起作用
- 绑定未来的类在 jQuery 中失败
- CSS 类在验证时只工作一次
- 添加/删除类在 Chrome 中对我不起作用
- CSS 类在特定场景中不适用
- jQuery类在分区刷新后没有添加
- 如何使我的.selected类在hrefs列表中重新加载后保持在正确的a(href)上
- ES6类:在超级方法中获取子类的正确名称
- es6 Javascript 类在回调中使用它
- css类在页面重新加载后处于活动状态
- 什么类在GWT中转换为java脚本
- ES6类:在另一个函数中包装方法实现
- 如果快速切换,ng类在绑定变量上不能很好地工作,这可能吗
- javascript类在每次迭代中看到多个DOM?jquery.每个人都很困惑
- 原型上具有默认属性的es6类在traceur中抛出
- 删除类在 iOS 上不起作用
- 找不到类 在电话间隙安卓中出现异常
- 删除类后的添加类在选择同一节点时在剑道树视图中不起作用
- 悬停添加类在Chrome上出现故障,但在Firefox上工作正常