我正在编写一个小型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()
。这只是一次。
那么,你们推荐什么?一个相对于另一个有什么优势吗?提前致谢。
答案 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 /其他开发人员为何在构造函数中使用函数。 我看不到任何其他情况,为什么你应该在构造函数中使用类函数 (日志除外)。