我突然想到,老实说,我从来没有必要一直使用类或构造函数,并开始想知道是否在某些情况下我应该使用它们?例如,下面的代码基本上是相同的,除了一个使用构造函数,一个不使用构造函数。
使用构造函数:
function Food(foodName, foodPrice) {
Currencies.call(this, foodPrice);
this.category = 'food';
this.name = foodName;
}
function Currencies(usd) {
this.usd = usd;
this.won = +usd * 1000;
}
const pizza = new Food('pizza', 30); // { usd: 30, won: 30000, category: 'food', name: 'pizza' }
const burger = new Food('burger', 10); // { usd: 30, won: 30000, category: 'food', name: 'pizza' }
不使用构造函数
function food(foodName, foodPrice) {
return { name: foodName, category: 'food', ...(currencies(foodPrice)) }
}
function currencies(usd) {
return { usd, won: usd * 1000 }
}
const pizza = food('pizza', 30); // { usd: 30, won: 30000, category: 'food', name: 'pizza' }
const burger = food('burger', 10); // { usd: 30, won: 30000, category: 'food', name: 'pizza' }
对我来说,不使用构造函数似乎更简单,所以我会避免使用它 AMAP。你更喜欢什么以及为什么?您到底什么时候决定使用构造函数而不是“常规”函数?
构造函数使您能够向对象本身编写方法,如果没有构造函数,则无法做到这一点。除此之外,您还可以提供自定义初始化,必须在对实例化对象调用任何其他方法之前完成该初始化。您还可以使用
extends
运算符从一个类继承到另一个类。这可以节省您一遍又一遍地重写相同内容的时间,并提供对对象更好、更轻松的控制。
请参阅以下链接了解更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/constructor
您的两个示例都使用构造函数。您的第一个示例使用两个对象构造函数。您的第二个示例使用两个函数,它们都包装
Object
,这是一个(标准内置对象)构造函数。您的两个示例都没有使用类构造函数。使用对象构造函数而不是 Object
有一个好处。
首先,对象属性的一般规则是将字段放入实例中,将方法放入原型中,以节省内存并启用继承。当然,您的示例不包含任何对象方法,但我猜您的问题比您的示例更广泛。
当您使用
Object
创建实例时,新实例将 Object.prototype
作为其原型。确实,您可以将方法放入 Object.prototype
中,但不鼓励这样做,因为所有对象的实例都会继承这些方法。当您使用像 Food
这样的对象构造函数时,新实例将获得 Food.prototype
作为其原型,该原型专用于 Food
实例。因此(如果 Food
有方法)您可以安全地将方法分配给 Food.prototype
。
另请参阅 https://medium.com/hagenhaus/diagrams-of-javascript-constructors-0e348b67dfee。