Я знаю, что на нескольких языках, таких как C++, вы можете создавать классы с множественным наследованием (или, по крайней мере, имитировать его с помощью таких интерфейсов, как Java). В JavaScript можно определить интерфейс, который может быть реализован в классе? Если да, то каким будет лучший способ приблизиться к этому, в идеале, каким-то образом включив цепочку прототипов. Будет ли ниже работать, или есть лучший способ?Определение интерфейса в JavaScript через цепочку прототипов
function Gizmo() {
console.log('Gizmo constructed');
}
Gizmo.prototype.wamboozle = function() {
console.log('wamboozle');
};
function EventEmitter() {
console.log('EventEmitter constructed');
this.events = {};
}
EventEmitter.prototype.on = function (name, callback) {
this.events[name] ? this.events[name].push(callback) : (this.events[name] = [callback]);
};
EventEmitter.prototype.emit = function (name, event) {
if (this.events[name]) {
this.events[name].forEach(function (callback) {
callback(event);
});
}
};
// set up inheritance and implementation
// maybe this could be a possibility?
Doohickey.prototype = Object.create(Gizmo.prototype);
Object.getOwnPropertyNames(EventEmitter.prototype).forEach(function (member) {
Doohickey.prototype[member] = EventEmitter.prototype[member];
});
function Doohickey() {
console.log('Doohickey constructed');
Gizmo.call(this); // initialize base class
EventEmitter.call(this); // initialize interface
}
Doohickey.prototype.turlywoops = function() {
console.log('turlywoops');
};
var myOwnDoohickey = new Doohickey();
// member function works
myOwnDoohickey.turlywoops();
// inherited member function works
myOwnDoohickey.wamboozle();
// interface member functions work
myOwnDoohickey.on('finagle', function (trick) {
console.log(trick);
});
myOwnDoohickey.emit('finagle', {
hello: 'world!'
});
// both true
console.log(myOwnDoohickey instanceof Doohickey);
console.log(myOwnDoohickey instanceof Gizmo);
// don't mind if this isn't necessarily true, though it would be nice
console.log(myOwnDoohickey instanceof EventEmitter);
Нет, вы не можете использовать цепочку прототипов для множественного наследования. – Bergi
Также обратите внимание на 'foo = Object.create (Foo.prototype);', 'foo instanceof Foo; // true' vs 'foo = Object.create (Foo);', 'foo instanceof Foo; // false. –
@PaulS. Исправлено, спасибо. –