首页 > 解决方案 > JS:从构造函数运行方法并且不再使用对象

问题描述

我正在编写一个小型 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()and sayName()。这样做时,是否建议从构造函数中调用这些方法,如下所示:

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

还是在像这样初始化对象后在外面调用它们更好:

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

注意:我永远不需要使用bark()andsayName()之后这样做。这只是一次的事情。

那么,大家有什么推荐的呢?一个比另一个有什么优势吗?提前致谢。

标签: javascriptdesign-patternssoftware-design

解决方案


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

不,不要那样做。构造函数应该只初始化一个对象,它不应该做任何其他事情。(它可能会使用辅助方法来做到这一点)。它绝对不应该导致输出或其他副作用。仅将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");

推荐阅读