JS:从构造函数运行方法,并且不再使用对象

时间:2018-11-20 20:54:14

标签: javascript design-patterns software-design

我正在编写一个小型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 :(得分:1)

  

建议从构造函数中调用这些方法

不,不要那样做。构造函数只能初始化一个对象,而不能做其他任何事情。 (它可能使用辅助方法来做到这一点)。它绝对不应引起输出或其他副作用。仅使用new调用才能运行过程,然后丢弃对象是一种反模式。

我建议改用静态方法:

class Dog {
    …

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

Dog.fastLife("german shepard");
  

…并且不再使用对象

极端,为什么您完全需要class?为什么在几乎不使用任何物品时都需要它?当您只需要一点功能时,就不要进行OOP操作。

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");

答案 1 :(得分:0)

想要添加Bergi撰写的内容。

如果需要使用这些方法(bark和sayName)来处理输入参数,则绝对应该从构造函数中使用它。简单的例子:您想在您的类中存储Dog散列的“名称”,而不是简单的“名称”。为此,您将创建方法hashDogsName,该方法输入名称作为参数并返回字符串。

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

请不要写这样的东西,我写了这个烂摊子来显示,该函数返回了其他字符串

在构造函数中,您将使用它:

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

因此,如果需要存储编辑后的对象,则需要在构造函数中使用函数。在其他情况下,您将不得不解释employeer /其他开发人员为何在构造函数中使用函数。 我看不到任何其他情况,为什么你应该在构造函数中使用类函数 (日志除外)。