[sensors] No way to express an abstract constructor in WebIDL

tobie has just created a new issue for https://github.com/w3c/sensors:

== No way to express an abstract constructor in WebIDL ==
Emailed @heycam on this topic.

Current proposal requires a constructor on the abstract super class to
 handle common instantiation logic, but that constructor shouldn't be 
instantiatable.

Here's how this would be roughly built in ES5:

```js
function AbstractSensor(options) {
    if (Object.getPrototypeOf(this) === AbstractSensor.prototype) {
        throw new TypeError("Illegal constructor");
    }
    this.frequency = options.frequency || 1;
}

function TemperatureSensor(options) {
    AbstractSensor.call(this, {
        frequency: options.frequency
    });
    this.unit = options.unit || "C";
}

inherit(TemperatureSensor, AbstractSensor);

function inherit(sub, sup) {
    sub.prototype = Object.create(sup.prototype);
    Object.defineProperty(sub.prototype, "constructor", {
        configurable: true,
        enumerable: false,
        writable: true,
        value: sub
    });
}

new TemperatureSensor({ unit: "F", frequency: 60 });
// returns TemperatureSensor instance

new AbstractSensor({ frequency: 60 });
// throws TypeError
```

So something like an `AbstractConstructor` [extended attribute][1] in 
WebIDL
would work. It would be behave just like the [normal `Constructor` 
extended
attribute][2] but would throw when not "subclassed."

[1]: http://heycam.github.io/webidl/#idl-extended-attributes
[2]: http://heycam.github.io/webidl/#Constructor


See https://github.com/w3c/sensors/issues/19

Received on Monday, 18 May 2015 09:52:40 UTC