2017-04-17 4 views
5

多くのプロパティを持つオブジェクトを作成しています。それらをインスタンス化するためのベストプラクティスについては興味があります。本当に長いコンストラクタ(新しいオブジェクトをインスタンス化するのは楽しいことではありません)を持っているのはかなり難しいようです。JavaScriptのロングコンストラクタのベストプラクティス

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, ...);

多分私はちょうどコンストラクタで多分3重要な特性(e.g.title、著者、およびページ)を設定し、残りの個々のセッターを書く必要がある場合、私は思ったんだけど。あるいは、一貫性のために私はセッターだけを使うべきですか?この方法で設定するのが最良の方法だとすれば、JSでこれらのメソッドを呼び出す(Javaのようなインターフェイスのような)ことを強制する良い方法はありますか?

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

最後に、私のコンストラクタにオブジェクトを渡すと、コンストラクタのPTも総敗北を構造化代入でしょうか?

+0

は、あなたが持っている(または持っている必要があります)ん前に、すべての値オブジェクトのインスタンスを作成しますか? - あなたが手に入れている情報でインスタンスを取得し、その後、必要に応じてデータソースまたはユーザー入力から残りのものをフェッチする場合があることはわかっています。このような場合は、ビルダーパターンをお勧めします - このフィドルを例として見てください:https://jsfiddle.net/brandonscript/p516ojn0/ – ochi

答えて

1

引数オブジェクトとmixinを使用するのが最善のようです。これは、オブジェクトをインスタンス化するコードを読みやすくするために、コンストラクターそのものがはるかに明白でないという点で、二重の剣のようなものです。例えば

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

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

デフォルト値が必要な場合は、別のミックスインで実装することができます。

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

    Object.assign(this, args); 
} 

その後のような呼び出し:

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

は与えるだろう:

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

を使用すると、特定の値が提供されていることを確認したい場合は、あなたがの終わりにテストする必要がありますそれらが存在し、エラーをスローするコンストラクタです。あなたはコピーコンストラクタパターン(その1つの引数としてのパラメータを含んだオブジェクトを取るコンストラクタ)単純化するためにdestructuringObject.assignを使用することができますES6で

2

:それはそれと呼ばれています

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

を、別のインスタンスからオブジェクトを簡単に作成できるようになりました。

有効なパラメータのみを割り当てるには、Object.assignに各プロパティを列挙します。

これは最初にコンストラクタを持つという目的を無効にしますか?これがクラスのすべてであれば、はいです。はい、そうです。しかし、うまくいけば、あなたのクラスにはこれ以外にいくつかの方法と目的があります。

1

ベストプラクティスは、コンストラクタにプロパティを定義するオブジェクトを渡すために、次のようになります。

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デモ:建設時https://jsfiddle.net/Lr6umykn/3/

関連する問題