Which way is best for creating an object in JavaScript? Is `var` necessary before an object property?

前端 未结 8 1840
无人共我
无人共我 2020-11-27 08:59

So far I saw three ways for creating an object in JavaScript. Which way is best for creating an object and why?

I also saw that in all of these examples the keyword

相关标签:
8条回答
  • 2020-11-27 09:37

    There is no "best way" to create an object. Each way has benefits depending on your use case.

    The constructor pattern (a function paired with the new operator to invoke it) provides the possibility of using prototypal inheritance, whereas the other ways don't. So if you want prototypal inheritance, then a constructor function is a fine way to go.

    However, if you want prototypal inheritance, you may as well use Object.create, which makes the inheritance more obvious.

    Creating an object literal (ex: var obj = {foo: "bar"};) works great if you happen to have all the properties you wish to set on hand at creation time.

    For setting properties later, the NewObject.property1 syntax is generally preferable to NewObject['property1'] if you know the property name. But the latter is useful when you don't actually have the property's name ahead of time (ex: NewObject[someStringVar]).

    Hope this helps!

    0 讨论(0)
  • 2020-11-27 09:39

    There is no best way, it depends on your use case.

    • Use way 1 if you want to create several similar objects. In your example, Person (you should start the name with a capital letter) is called the constructor function. This is similar to classes in other OO languages.
    • Use way 2 if you only need one object of a kind (like a singleton). If you want this object to inherit from another one, then you have to use a constructor function though.
    • Use way 3 if you want to initialize properties of the object depending on other properties of it or if you have dynamic property names.

    Update: As requested examples for the third way.

    Dependent properties:

    The following does not work as this does not refer to book. There is no way to initialize a property with values of other properties in a object literal:

    var book = {
        price: somePrice * discount,
        pages: 500,
        pricePerPage: this.price / this.pages
    };
    

    instead, you could do:

    var book = {
        price: somePrice * discount,
        pages: 500
    };
    book.pricePerPage = book.price / book.pages;
    // or book['pricePerPage'] = book.price / book.pages;
    

    Dynamic property names:

    If the property name is stored in some variable or created through some expression, then you have to use bracket notation:

    var name = 'propertyName';
    
    // the property will be `name`, not `propertyName`
    var obj = {
        name: 42
    }; 
    
    // same here
    obj.name = 42;
    
    // this works, it will set `propertyName`
    obj[name] = 42;
    
    0 讨论(0)
提交回复
热议问题