семантические имена для конструкторов/прототипов JS и классов

В javascript es6 у нас есть классы, в которых мы можем сделать что-то вроде этого:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }

  getArea() {
    return this.height * this.width
  }

  static someStaticMethod() {
    // does some utility or something
  }
}

Это примерно просто синтаксический сахар для следующего старого кода es5:

function Rectangle() {
  this.height = height;
  this.width = width;
}

Rectangle.prototype.getArea = function() {
  return this.height * this.width
}

Rectangle.someStaticMethod = function() {
  // does some utility or something
}

В классе es6 достаточно просто пометить следующее:

  • Rectangle – это класс
  • getArea – это метод экземпляра.
  • someStaticMethod — это класс или статический метод

Я преподаю класс по прототипам и классам объектов, поэтому я хочу, чтобы формулировка была правильной для вышеизложенного. Но дополнительно...

В контексте es5 JS как классифицируются вышеперечисленные? Ниже моя попытка:

  • Rectangle — это функция-конструктор.
  • getArea – это метод-прототип.
  • someStaticMethodявляется методом-конструктором

Я не совсем уверен, следует ли их называть в es5 так же, как в es6, или имена, которые я им дал, абсолютно точны.


person Andrew Kim    schedule 04.12.2018    source источник
comment
Обратите внимание, что ES7 позволяет вам определять static методы непосредственно в классе   -  person Matthew Herbst    schedule 05.12.2018
comment
@MatthewHerbst ES7 ничего не изменил в static?   -  person Bergi    schedule 05.12.2018
comment
@MatthewHerbst, это ES6. Единственным введенным синтаксисом ES7/ES2016 был **, который был синтаксическим сахаром для Math.pow().   -  person Patrick Roberts    schedule 05.12.2018
comment
Термин метод экземпляра иногда используется, чтобы отличить собственные методы (созданные в конструкторе самого экземпляра) от методов-прототипов. Но его все еще можно использовать, когда вы не говорите об этой разнице. Другие варианты: обычный метод, нестатический метод или просто метод.   -  person Bergi    schedule 05.12.2018
comment
Я бы сказал, что getArea() — это метод прототипа, а getArea = () => {...} — метод экземпляра. Это имеет значение, например, в React, где методы часто используются в качестве обратных вызовов и должны иметь привязку к контексту.   -  person marzelin    schedule 05.12.2018
comment
@marzelin Я согласен, что различие может быть важным, но я бы никогда не стал называть стрелочную функцию методом :-)   -  person Bergi    schedule 05.12.2018
comment
@Bergi функция стрелки, установленная в конструкторе, привязана к экземпляру. Для меня это заслуживает того, чтобы называться методом экземпляра, а не функцией, установленной в прототипе, поскольку она всегда выполняется в контексте этого конкретного экземпляра.   -  person marzelin    schedule 05.12.2018


Ответы (2)


Имена, которые вы дали, в значительной степени точны, за исключением того, что последнее может быть немного спорным:

Rectangle.someStaticMethod = function() {
  // does some utility or something
}

Вы сказали:

someStaticMethod — это метод-конструктор.

Вы могли бы назвать это так или просто методом, но по сути да, все в вашем вопросе верны.

person Jack Bashford    schedule 04.12.2018
comment
да, это был тот, в котором я был определенно самым сомнительным, если бы вам пришлось рискнуть сказать свое слово перед методом для типа метода, который бы вы выбрали? = Д - person Andrew Kim; 05.12.2018
comment
@AndrewKim Я не знаю, может быть object method? Или literal method? - person Jack Bashford; 05.12.2018

Rectangle — функция-конструктор

Да, это звучит хорошо. Это функция, которая создает новые экземпляры, поэтому описание подходит.

getArea является методом-прототипом

Метод — это функция как свойство, и в этом случае он действительно является частью прототипа.

someStaticMethod - метод конструктора

Это немного вводит в заблуждение, поскольку звучит так, как будто это метод создания чего-то. Я бы скорее назвал это методом конструктора. Однако я обычно называю это «статическим методом».

person Jonas Wilms    schedule 04.12.2018
comment
спасибо, третий был тем, из-за которого я был определенно самым неудобным. - person Andrew Kim; 05.12.2018