【发布时间】:2015-02-08 06:35:05
【问题描述】:
我最近开始使用 traceur,并在原型上创建具有默认值的类时偶然发现了一个奇怪的行为。我想知道这是 traceur 中的错误还是 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);
当我尝试设置只读属性“v”时,它会引发我无法分配给它的错误。这没有意义,因为属性是在原型上定义的,而不是在实例上。此外,我无法在密封/冻结/不可扩展对象上抛出 es5 的错误,据我所知,代理没有在 V8 中实现,所以......它是如何首先抛出错误的?这不是编译时错误。
我的主要兴趣不是“让它发挥作用”,这是微不足道的。您需要做的就是将this.v = v 替换为Object.defineProperty 等效项。我主要想知道它是否以及为什么会以这种方式运行,以及此数据结构中是否存在负面性能影响,通过将默认属性分配给原型而不是将它们存储在每个实例上来超过内存增益。
【问题讨论】:
标签: javascript ecmascript-6 traceur