forwardonly2015, да это само собой, просто я написал пример - как это выглядит на ES6, а не о том "
треше", когда чтоб добавить новую "утку", нужно перелопатить весь код. Т.е банальное наследование.
На самом деле -  мне было лень писать абстрактный класс, а потом еще утки =)
т.е
class AbstractDuck {
	constructor(name) {
		this.name = name;
	}
	// все утки умеют плавать	
	swim(name) {
		// TODO
	}
	
	// не все утки умеют летать, поэтому пусть это будет "будто" метод интерфейса
	fly() {}
	// другие общие методы
}
class Duck extends AbstractDuck {
	
	constructor(name) {
		super(name);
	}
	// а эта - умеет еще и летать.
	fly() {
		super();
		// TODO
	}
	// другие методы
}
Да и знания мои в ООП - забей ваще, допустим - "обычная утка" и "резиновая" умеют крякать, одно дело, если они крякают по разному тогда есть смысл реализовывать для них разные методы 
quack, но если методы идентичны, а в абстрактный класс их не вынесешь, ибо возвращаемся к тому, что "деревянная" утка будет знать о том, что знать не должна, а если реализовывать - как и задумано, т.е перегружать методы, то получится копипаст, а это тоже не ок=)