JS: Запуск методов из конструктора и повторное использование объекта - PullRequest
0 голосов
/ 20 ноября 2018

Я пишу небольшое приложение JS и хотел спросить о некоторых лучших методах.Итак, скажем, у меня есть класс с именем Dog, например:

class Dog {
    constructor(name) {
        this.name = name;
    }
    bark() {
        console.log(`Bark Bark - ${this.name}`);
    }
    sayName() {
        console.log(`My name is ${this.name}`);
    }
}

Когда я создаю новый объект, который является экземпляром класса Dog, мне всегда нужно вызывать bark() и sayName().При этом рекомендуется вызывать эти методы из конструктора следующим образом:

constructor(name) {
    this.name = name;
    this.bark();
    this.sayName();
}

или лучше вызывать их снаружи после инициализации объекта следующим образом:

let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();

Примечание: мне никогда не нужно использовать bark() и sayName() после этого.Это единовременная вещь.

Итак, что вы, ребята, рекомендуете?Есть ли преимущества для одного над другим?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Хочу добавить, что написал Берги.

Если эти методы (bark и sayName) необходимы для обработки входных параметров, вам определенно следует использовать их из конструктора.Простой пример: вы хотите хранить в себе класс Dog hashed 'name', достаточно простое 'name'.Для этого вы создадите метод hashDogsName, который вводит имя в качестве параметра и возвращает строку.

function hashDogName(name) { return name.split('').reverse().join(''); }

Пожалуйста, не пишите такую ​​вещь, я написал этот беспорядок, чтобы показать, что функция возвращаетдругая строка

И в вашем конструкторе вы будете использовать его:

class Dog {
    constructor(name) {
        this.hashedName = this.hashDogName(name);
    }
}

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

0 голосов
/ 21 ноября 2018

Рекомендуется ли вызывать эти методы из конструктора

Нет, не делайте этого.Конструктор должен только инициализировать объект, он не должен делать ничего другого.(Для этого могут использоваться вспомогательные методы).Это определенно не должно вызывать выход или другие побочные эффекты.Использование new вызовов только для запуска процедуры и последующего отбрасывания объекта является антипаттерном.

Я бы рекомендовал вместо этого ввести статический метод:

class Dog {
    …

    static fastLife(name) {
        const dog = new this(name);
        dog.bark();
        dog.sayName();
        // dog dies
    }
}

Dog.fastLife("german shepard");

… ине использовать объект снова

В крайнем случае, зачем вам вообще нужен class?Зачем вам вообще нужен объект, когда вы его почти не используете?Не переходите на ООП, когда все, что вам нужно, это небольшая функция.

function fastLivedDog(name) {
    function bark() {
        console.log(`Bark Bark - ${name}`);
    }
    function sayName() {
        console.log(`My name is ${name}`);
    }
    // in this example, the local functions are called only once
    // and could be trivially inlined…
    bark();
    sayName();
}

fastLivedDog("german shepard");
...