Предоставление методов делегата в качестве автора пакета

Я работаю над пакетом npm, который должен использоваться другими. Я решил, что пакет должен предоставлять функции, облегчающие работу с объектами, определенными в моем пакете. В частности, функции, которые «делегируют» методы.

Например bark

function Dog(name) {
  this.name = name
}

Dog.prototype.bark = function bark() {
  return `${this.name}: Woof!`
}

function bark(dog) {
  return dog.bark()
}

// Example use of bark.
console.log(
  [ new Dog('Spike') ].map(bark)
)

Однако я понял, что также можно реализовать его другим способом; делая Dog.prototype.barkделегат bark:

function Dog(name) {
  this.name = name
}

Dog.prototype.bark = function bark() {
  return bark(this) 
}

function bark(dog) {
  return `${dog.name}: Woof!`
}

// Example use of bark.
console.log(
  [ new Dog('Spike') ].map(bark)
)

Мой вопрос: Должен ли автор пакета предпочесть один стиль другому или нет никакой разницы?

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

1 ответ

  1. Рассмотрим, что вы реализуете два класса, DogиWolf, которые оба реализуют интерфейсCanidae, означающий, что у них есть barkметод.

    В большинстве случаев, barkв Dog.prototype.barkWolf.prototype.barkзависимости от передаваемого объекта, требуется делегировать метод или методу.

    // Dog class
    function Dog(name) {
      this.name = name
    }
    
    Dog.prototype.bark = function bark() {
      return `${this.name}: Woof!`
    }
    
    // Wolf class
    function Wolf(name) {
      this.name = name
    }
    
    Wolf.prototype.bark = function bark() {
      return `${this.name}: Woooooooooooooooh!`
    }
    
    // Delegating method
    function bark(canidae) {
      return canidae.bark()
    }
    
    // Example use of bark.
    console.log(
      [ new Dog('Spike'), new Wolf('Jack') ].map(bark)
    )