Javascript JS:从构造函数运行方法,不再使用对象
我正在编写一个小的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}`);
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);
}
}
所以,若需要存储编辑过的对象,则需要在构造函数中使用函数。在其他情况下,您必须向员工/其他开发人员解释为什么在构造函数中使用函数。
我看不到任何其他情况下为什么要在构造函数中使用类函数
(除了日志)。在您的情况下,我会将这些方法调用放入构造函数中。只是因为使用类时代码太少。当然,在创建实例时,您将始终执行这些方法。我认为这个问题处于基于观点的边缘,但是如果
吠叫和说只在构建实例时发生,则应该在构造函数中调用它们。事实上,不清楚为什么它们需要成为方法,也不清楚为什么它需要成为对象。