Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:从构造函数运行方法,不再使用对象_Javascript_Design Patterns_Software Design - Fatal编程技术网

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

Javascript JS:从构造函数运行方法,不再使用对象,javascript,design-patterns,software-design,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}`);

我正在编写一个小的JS应用程序,想了解一些最佳实践。那么,假设我有一个名为
Dog
的类,如下所示:

class Dog {
    constructor(name) {
        this.name = name;
    }
    bark() {
        console.log(`Bark Bark - ${this.name}`);
    }
    sayName() {
        console.log(`My name is ${this.name}`);
    }
}
constructor(name) {
    this.name = name;
    this.bark();
    this.sayName();
}
let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();
当我创建一个新对象作为
Dog
类的实例时,我总是需要调用
bark()
sayName()
。执行此操作时,建议从构造函数调用以下方法:

class Dog {
    constructor(name) {
        this.name = name;
    }
    bark() {
        console.log(`Bark Bark - ${this.name}`);
    }
    sayName() {
        console.log(`My name is ${this.name}`);
    }
}
constructor(name) {
    this.name = name;
    this.bark();
    this.sayName();
}
let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();
或者在初始化对象后,最好在外部调用它们,如下所示:

class Dog {
    constructor(name) {
        this.name = name;
    }
    bark() {
        console.log(`Bark Bark - ${this.name}`);
    }
    sayName() {
        console.log(`My name is ${this.name}`);
    }
}
constructor(name) {
    this.name = name;
    this.bark();
    this.sayName();
}
let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();
注意:完成此操作后,我永远不需要使用
bark()
sayName()
。这只是一次而已

你们有什么建议吗?一个比另一个有什么优势吗?提前谢谢

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

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

我建议引入一种静态方法:

class Dog {
    …

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

Dog.fastLife("german shepard");
…并且不再使用对象

极端地说,你为什么需要一个
?当你几乎不用一件物品时,为什么你还需要它呢?当你所需要的只是一个小函数时,不要使用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");

想要添加Bergi写的内容

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

function hashDogName(name) { return name.split('').reverse().join(''); }
请不要写这样的东西,我写这个乱七八糟的东西是为了显示,该函数返回其他字符串

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

class Dog {
    constructor(name) {
        this.hashedName = this.hashDogName(name);
    }
}
所以,若需要存储编辑过的对象,则需要在构造函数中使用函数。在其他情况下,您必须向员工/其他开发人员解释为什么在构造函数中使用函数。 我看不到任何其他情况下为什么要在构造函数中使用类函数
(除了日志)。

在您的情况下,我会将这些方法调用放入构造函数中。只是因为使用类时代码太少。当然,在创建实例时,您将始终执行这些方法。我认为这个问题处于基于观点的边缘,但是如果
吠叫
只在构建实例时发生,则应该在构造函数中调用它们。事实上,不清楚为什么它们需要成为方法,也不清楚为什么它需要成为对象。