这种创建对象的方式真的更好吗? (javascript)

Is this way to create object really better? (javascript)

我读过这本书,当然在创建更多对象时使用构造函数会更好,并且被告知输入更少,但在本章末尾它提供了另一种创建对象的选项,这实际上需要很多打字让我觉得只是以不同的方式制作对象文字。

假设有一个汽车对象:

function Car(make, model, year, color, passengers, convertible, mileage){
    this.make = make;
    this.model = model;
    this.year = year;
    this.color = color;
    this.passengers = passengers;
    this.convertible = convertible;
    this.mileage = mileage;
    this.started = false;
    this.start = function(){
        this.started = true;
    };
    this.stop = function(){
        this.started = false;
    };
    this.drive = function(){
        if(this.started){
            console.log(this.make + " " + this.model + " goes zoom zoom!");
        }else{
            console.log("Start the engine first.");
        }
    }
}

正在创建新的 Car 对象

var chevy = new Car("Chevy", "Bel Air", 1957, "red", 2, false, 1021);
var cadi = new Car("GM", "Cadillac", 1955, "tan", 5, false, 12892);
var taxi = new Car("Webville Motors", "Taxi", 1955, "yellow", 4, false, 281341);
var fiat = new Car("Fiat", "500", 1957, "Medium Blue", 2, false, 88000);
var testCar = new Car("Webville Motors", "Test Car", 2014, "marine", 2, true, 21)

我能理解以上所有内容,但是这本书提出了一种更好的方法,另一种需要更多输入的方法是将这些参数存储到另一个变量中,然后像这样更改构造函数

function Car(params){
    this.make = params.make;
    this.model = params.model;
    this.year = params.year;
    this.color = params.color;
    this.passengers = params.passengers;
    this.convertible = params.convertible;
    this.mileage = params.mileage;
    this.started = false;
    this.start = function(){
        this.started = true;
    };
    this.stop = function(){
        this.started = false;
    };
    this.drive = function(){
        if(this.started){
            console.log(this.make + " " + this.model + " goes zoom zoom!");
        }else{
            console.log("Start the engine first.");
        }
    }
}

var chevyParam = {
    make: "Chevy",
    model: "Bel Air",
    year: 1957,
    color: "red",
    passengers: 2,
    convertible: false,
    mileage: 1021
}

var chevy = new Car(chevyParam);

好像我了解发生了什么以及它是如何工作的,但第二个真的比第一个更好更整洁吗?我知道第二个不必关心是否以错误的顺序输入参数但还有很多工作

两种方法都不错。 'Good' 根据 google 表示 "having the qualities required for a particular role."。如果能满足你的需求就好了。

然而,大多数编程社区通常不赞成某些做事方法不明确(不可读)或骇人听闻。你描述的这两种方法既不黑也不晦涩,它们只是迎合了不同的需求。

方法一:

  • 可读性较差

  • 可能更容易混淆变量,并且对于审查您的代码的人来说并不明显。

  • 短多了

我个人认为对于属性少的简单对象,第一种方法是最合适的。

方法二:

  • 相当可读

  • 可以说更难混淆变量,而且对于审查您的代码的人来说更明显。

  • 有点长

对于更复杂的对象,例如汽车,您可能希望使用第二种方法,因为它更明确并且值可以乱序而不会破坏任何东西。

同时考虑通过这样做添加默认值:this.model = params.model || ”default model if params.model is undefined”;

两种方法都完全有效。我要说的是,在你所做的事情上保持一致更为重要。如果您使用两种方法(参数 objects 和 header 中传递的一堆变量)制作 objects,那么这就是草率代码。这有点像 JS 中的 ' vs "。它们本质上做同样的事情,最重要的是你使用的代码是一致的。