Задать вопрос
@alexnotonfire

Когда использовать методы в конструкторе, а когда — в прототипе?

Я не понимаю, в каких случаях необходимо метод объекта объявлять в самом конструкторе, а когда - в прототипе.

Вот например в коде ниже я не вижу разницы между двумя методами и хотелось бы чтобы кто-то пролил свет на их использование.

function A() {
  this.method = function() {
    alert('Метод конструктора');
  }
}

A.prototype.method2 = function() {
	alert('Метод прототипа');
}

let object = new A();


Известно ведь, что в новом стандарте ES6 с синтаксисом классов и вовсе нет методов в конструкторе.
  • Вопрос задан
  • 1337 просмотров
Подписаться 2 Простой 2 комментария
Решение пользователя Andrey Perov К ответам на вопрос (5)
SnaIP
@SnaIP
Front-end разработчик
Во первых при создание метода в конструкторе, вы переопределяете каждый раз его.
Во вторых как говорилось выше, зачем вам для каждого объекта создавать свой метод, когда лучше обратится по цепочке прототипов к нему.

Вот простой пример как лучше делать 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'
})
Ответ написан
Комментировать