Something went wrong while setting issue due date.
[BUG] class accessors are not configurable
When defining a class in ES6, like
class Foo {
get bar() {...}
set bar(value) {...}
}
the accessors are configurable
.
However, Buble output uses Object.defineProperties
to create the accessors, and by default Object.defineProperties
sets configurable to false
.
This makes some code, like the following utility function that I use in non-Buble projects fail:
function makeAccessorsEnumerable(object) {
const props = Object.getOwnPropertyNames(object)
for (let l=props.length, i=0; i<l; i+=1) {
const prop = props[i]
const descriptor = Object.getOwnPropertyDescriptor(object, prop)
console.log('descriptor for '+prop+':', descriptor)
if (descriptor && (descriptor.set || descriptor.get)) {
descriptor.enumerable = true
Object.defineProperty(object, prop, descriptor)
}
}
}
To reproduce the bug, you can paste and run the following in Chrome console:
class Foo {
get bar() {return this.v}
set bar(v) {this.v = v}
}
makeAccessorsEnumerable(Foo.prototype) // it works, so far so good!
Object.defineProperties(Foo.prototype, {
lorem: {set: function(v) {this.l = v}, get: function() {return this.l}}
})
makeAccessorsEnumerable(Foo.prototype) // ERROR, because lorem is not configurable!
function makeAccessorsEnumerable(object) {
const props = Object.getOwnPropertyNames(object)
for (let l=props.length, i=0; i<l; i+=1) {
const prop = props[i]
const descriptor = Object.getOwnPropertyDescriptor(object, prop)
console.log('descriptor for '+prop+':', descriptor)
if (descriptor && (descriptor.set || descriptor.get)) {
descriptor.enumerable = true
Object.defineProperty(object, prop, descriptor)
}
}
}
The same applies to static
accessors.