Во первых при создание метода в конструкторе, вы переопределяете каждый раз его.
Во вторых как говорилось выше, зачем вам для каждого объекта создавать свой метод, когда лучше обратится по цепочке прототипов к нему.
Вот простой пример как лучше делать es5
var root = document.getElementById('root');
// наш конструктор
function FabricButton(options) {
this.element = document.createElement('button');
this.element.innerHTML = (typeof options.text == 'string') ? options.text : 'there had to be text';
this.element.style.color = (typeof options.color == 'string') ? options.color : 'blue';
}
// выносим метод нашего класса в прототип, чтобы при создание не перезаписывать его
FabricButton.prototype.render = function(root) {
root.appendChild(this.element);
}
function FabricButtonPopup(options) {
FabricButton.call(this, options);
this.element.addEventListener('click', this.popup);
}
// Здесь наследуем наш прототип, то есть сюда попадет {constructor: f, render: f}
FabricButtonPopup.prototype = Object.create(FabricButton.prototype);
FabricButtonPopup.prototype.constructor = FabricButtonPopup; // переопределяем ссылку на наш конструктор
FabricButtonPopup.prototype.popup = function() {
prompt('open window')
}
var button = new FabricButton({
text: 'press here',
color: null
})
var buttonPopup = new FabricButtonPopup({
text: 'press here man',
color: 'red'
})