2017-04-17 79 views
5

Çok sayıda özelliği olan nesneler oluşturuyorum ve bunları oluşturmak için en iyi uygulamaları merak ediyorum. Gerçekten çok uzun kurucuların olması oldukça kötü gibi görünüyor (yeni nesnelerin başlatılması eğlenceli değil). belki de sadece yapıcı (e.g.title, yazar ve sayfa) içinde belki üç önemli özellikleri ayarlamak ve geri kalanı için bireysel ayarlayıcılar yazmalıyım eğer JavaScript'te Uzun Ekstrüktörler İçin En İyi Uygulamalar

function Book(title, author, pages, chapters, publisher, datePublished, authorHometown, protagonistFavoriteColor) { 
 
    this.title = title; 
 
    this.authorpages = authorpages; 
 
    this.pages = pages; 
 
    this.chapters = chapters; 
 
    this.publisher = publisher; 
 
    this.datePublished = datePublished; 
 
    this.authorHometown = authorHometown; 
 
    this.protagonistFavoriteColor = protagonistFavoriteColor; 
 
} 
 

 
// not reliable to remember how to order params 
 
var rc = new Book("Robinson Crusoe", "Daniel Defoe", 342, 16, ...);

merak ediyorum. Ya da tutarlılık için sadece ayarlayıcıları kullanmalı mıyım? Bu şekilde ayarlanması en uygun yol ise, JS'de bu yöntemlerin çağrılması için iyi bir yol var mıdır (Java'daki gibi arayüzler gibi)?

function Book (title, author, pages){ 
 
    this.title = title; 
 
    this.author = author; 
 
    this.pages = pages; 
 
    this.chapters = null; 
 
    this.publisher = null; 
 
    this.datePublished = null; 
 
    this.authorHometown = null; 
 
    this.protagonistFavoriteColor = null; 
 
} 
 

 
var rc = new Book("Robinson Crusoe", "Daniel Defoe", 342); 
 
rc.setChapters(16); 
 
rc.setPublisher("John Smith Co."); 
 
rc.setDatePublished("04-25-1719"); 
 
rc.setAuthorHometown("London"); 
 
rc.setProtagonistFavoriteColor("lilac"); 
 
// we'd also want to mandate that these setters be called so nothing is left null

Son olarak, benim yapıcı bir nesne geçirerek ve bir yapıcısının nk toplam yenilgi kurucuların ki?

+0

, sen var mı (ya da olması gerekir) önce tüm değerleri nesnenin örneğini oluşturmak? - Bazı durumlarda örneği elinizde tuttuğunuz bilgilerle almak ve geri kalanını (gerekirse) veri kaynağı veya kullanıcı girdisinden almak istediğinizi biliyorum. Bu durumda, yapımcı modelini öneriyorum - bir örnek olarak şu bilmeceye bakın: https://jsfiddle.net/brandonscript/p516ojn0/ – ochi

cevap

1

Bir arguments nesnesinin ve bir karıĢımın kullanılması en iyi yol gibi görünüyor. Bu, iki ucu keskin bir kılıçtır, çünkü nesneyi daha kolay okunan kod haline getirir, ancak kurucunun kendisi daha az belirgindir. Örneğin.

function Book(args) { 
    Object.assign(this, args); 
} 

var rc = new Book({ 
    name: "Robinson Crusoe", 
    author: "Daniel Defoe", 
    pages: 342 
}); 

Varsayılan değerler istiyorsanız, bunu başka bir miksle ör.

function Book(args) { 
    args = Object.assign(args, { 
     protagonistFavoriteColor: "Red" 
    }); 

    Object.assign(this, args); 
} 

Sonra bir çağırma gibi:

var rc = new Book({ 
    name: "Robinson Crusoe", 
    author: "Daniel Defoe", 
    pages: 342 
}); 

verir misiniz:

rc.author; // "Daniel Defoe" 
rc.protagonistFavoriteColor // "Red" 

Emin belirli değer verilir olmak için

, sen sonunda test etmek gerekir Bu yapıcılar mevcut ve bir Hata attı. Eğer kopya yapıcısı deseni (onun tek argüman olarak bir parametre yüklü nesne alarak bir yapıcı) basitleştirmek destructuring ve Object.assign kullanabilirsiniz ES6 yılında

2

: O denir

function Book({title, author, pages, chapters, publisher, datePublished, 
 
       authorHometown, protagonistFavoriteColor}) { 
 
    Object.assign(this, {title, author, pages, chapters, publisher, datePublished, 
 
         authorHometown, protagonistFavoriteColor}); 
 
} 
 

 
var rc = new Book({title: "Robinson Crusoe", author: "Daniel Defoe", 
 
        pages: 342, chapters: 16}); 
 

 
var copy = new Book(rc); 
 

 
console.log(JSON.stringify(rc)); 
 
console.log(JSON.stringify(copy)); 
 
console.log(copy == rc); // false

, çünkü şimdi başka bir örnek üzerinden kolayca bir nesne oluşturabilirsiniz.

Biz sadece geçerli parametreler atamak için, Object.assign özelliklerin her birini numaralandırmak.

bu ilk etapta bir kurucu sahip amacı yenmek mu? Eğer sınıfın hepsi bu ise, o zaman evet. Evet öyle. Ama umarım, dersiniz bunun dışında bir yöntem ve amaca sahiptir.

1

En iyi uygulama yapıcı içine özelliklerini tanımlayan bir nesne geçmek olacaktır:

function Book(props) { 
    // create variables out of object (if you need to) 
    const { 
    title, 
    author, 
    pages, 
    chapters, 
    publisher, 
    datePublished, 
    authorHometown, 
    protagonistFavoriteColor 
    } = props; 

    // assign properties to instance object 
    Object.assign(this, props); 
} 

const rc = new Book({ 
    title: "Robinson Crusoe", 
    author: "Daniel Defoe", 
    pages: 342, 
    chapters: 16, 
    // rest of properties 
}); 

console.log(rc); 

JSFiddle Demosu: https://jsfiddle.net/Lr6umykn/3/ inşaat anda

İlgili konular