Различия между 'extends' в coffeescript и 'util.inherits' в node.js

Недавно я изучаю Node.js. У меня вопрос о функции util.inherits в Node.js. Могу ли я использовать extends в coffeescript для его замены? Если нет, каковы различия между ними?

Ответы

Ответ 1

Да, вы можете использовать extends вместо него.

Что касается различий? Начнем с CoffeeScript:

class B extends A

Посмотрите JavaScript, созданный компилятором CoffeeScript для этого JavaScript:

var B,
  __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

B = (function(_super) {

  __extends(B, _super);

  function B() {
    return B.__super__.constructor.apply(this, arguments);
  }

  return B;

})(A);

Итак, __extends используется для объявления отношения наследования между B и A.

Снова перескажите __extends в CoffeeScript:

coffee__extends = (child, parent) ->
  child[key] = val for own key, val of parent

  ctor = ->
    @constructor = child
    return
  ctor.prototype = parent.prototype

  child.prototype = new ctor
  child.__super__ = parent.prototype

  return child

(Вы можете проверить, что это верное воспроизведение скомпилировать его обратно в JavaScript.)

Вот что происходит:

  • Все ключи, найденные непосредственно на parent, установлены на child.
  • Создается новый конструктор прототипов ctor с установленными его экземплярами 'constructor свойствами, а его prototype - родительским.
  • В дочернем классе prototype установлен экземпляр ctor. ctor constructor будет установлен в child, а сам прототип ctor parent.
  • Свойство child class __super__ установлено на parent prototype, для использования с помощью ключевого слова CoffeeScript super.

node документация описывает util.inherits следующим образом:

Наследовать методы прототипов от одного конструктора к другому. прототип конструктора будет установлен на новый объект, созданный из superConstructor.

В качестве дополнительного удобства суперконструктор будет доступен через свойство constructor.super_.

В заключение вам не нужно использовать util.inherits, если вы используете классы CoffeeScript; просто используйте инструменты, которые дает CS, и вы получаете бонусы, такие как ключевое слово super.