@rtfmmftr
кратко о себе

Объявление методов прототипа — как лучше?

Всем известны такие примеры из множества источников:
function Human(name) {
  this._name = name;
  Human.prototype.sayName = function() {
    alert('My name is '+ this._name);
  }
}

Вроде бы логично и красиво что расширение прототипа инкапсулировано внутри функции-конструктора. Но получается что всякий раз при создании экземпляра будет выполняться лишнее присвоение одной и той же функции в прототипе.
var alex = new Human('Alex');
var john = new Human('John');
...

Правильно ли я предполагаю, что интерпретатор каким-то образом умеет оптимизировать и пропускать такие действия? И если нет, то почему бы не делать так?
Human.prototype.sayName = function() {
    alert('My name is '+ this._name);
}
function Human(name) {
  this._name = name;
}
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
class Human {
  constructor(name) {
    this.name = name;
  }

  sayName() {
    console.log(`My name is ${this.name}`);
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Правильно ли я предполагаю, что интерпретатор каким-то образом умеет оптимизировать и пропускать такие действия?

Правильно
Тык

И если нет, то почему бы не делать так?

Обычно делали (до 2014-2015) так:
var Human = (function() {
  function Human(name) {
    this._name = name;
  }
  Human.prototype.sayName = function() {
    alert('My name is ' + this.name);
  }
  return Human;
})()


Сейчас делают (не забываем про Babel) так:
class Human {
  constructor(name) {
    this.name = name;
  }
  sayName() {
    alert('My name is '+ this.name);
  }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы