2016-05-30 9 views
1

私はすでに作成されたオブジェクトを使って新しいオブジェクトを作成しようとしています。これは私が達成しようとしているものです:あなたが見ることができるように、私はアメリカに住んで起こるパトリックと呼ばれる新しい人、25歳を作成しようとしていますJavascriptコンストラクタ - オブジェクトを使用しますか?

var obj = {"Name" : "Patrick", "Age": 25, "Country": "US"}; 
document.writeln(JSON.stringify(obj) + "<br />"); 

function Person(name, age, country) { 
    this.name = name; 
    this.age = age; 
    this.country = country; 
} 

document.writeln(JSON.stringify(new Person(obj))); 

https://jsfiddle.net/dotjz9tb/

。私のPersonコンストラクタは、パラメータとして名前、年齢、国を取ります。しかし、私のオブジェクトは以前の関数からすでに作成されているので、new Person(obj)を実行したいとし、objのパラメータに基づいて新しいオブジェクトを作成します。

私はnew Person(obj.name, obj.age, obj.country)をやることができると知っていますが、代わりに、コンストラクタをオブジェクトに代わって渡しますが、まだ実行できるのはまだnew Person("Jack", 52, "UK")です。

このようなことは可能ですか?今のところ、これはそれが本当に作成されています方法です:

new Person(obj, undefined, undefined); 
//or 
{ 
    "name": { 
     "Name":" Patrick"," 
     Age":25, 
     "Country":"US" 
    } 
} 

nameが私のオブジェクトに設定されている間agecountryは、何も設定されていることを意味します。

+0

としてそれを呼び出すことができます){ this.name = obj.Name; this.age = obj.Age; this.country = obj.Country; } ' – Rayon

+0

@Rayonその後、オブジェクトを取得する新しいコンストラクタを作成する必要があります。 – MortenMoulder

+0

それの中の条件... 'arguments.length'のようなもの? – Rayon

答えて

1

あなたがここにたくさんのオプションを持っています。

たとえば、Personの引数に多態性を付けることができます。

function Person(name, age, country) { 
    if(arguments.length === 1 && typeof name === 'object') { 
     var data = arguments[0]; 
     name = data.name; //etc 
    } 
    //the rest of ctor code goes here 
} 

それともBETTER使用工場機能と簡単なコンストラクタコードを保つことが多型のインターフェイスを避ける方が良いでしょう。一般に

function copyPerson(obj) { 
    return new Person(obj.name, obj.age, obj.country); 
} 

//or even 
Person.copy = function(obj) { 
    return new this(obj.name, obj.age, obj.country) 
} 
+0

新しい関数を作ることは、 "meh"のようなものです。私はむしろ1つのコンストラクタに固執したいと思います。 – MortenMoulder

+0

まあ、それはあなた次第です。しかし、あなたのコンストラクタコードを複雑にすることは反パターンです。ファクトリ関数はメンテナンスが容易です。 –

+0

私は完全に同意しますが、私は 'new Person()'を行い、オブジェクトまたはいくつかのパラメータのいずれかを解析したいと思います。 – MortenMoulder

0

これは、両方の入力フォーマットをサポートするために何ができるかです:

function Person(name, age, country) { 
     var obj; 
     if(typeof(name) === 'object'){ 
      obj = name; 
      name = obj.name; 
      age = obj.age; 
      country = obj.country; 
     } 
     this.name = name; 
     this.age = age; 
     this.country = country; 
    } 
+0

これまでのところ、これは私のための最良の選択肢のように見えます。ありがとう。 – MortenMoulder

+0

実際、そうではありません。この種の多型を避けるのが最善です。代わりに、ある答えが示唆するように、クラス上に 'copy'メソッドを、あるいは(プロトタイプ内で)インスタンスに対して' clone'メソッドを持たせてください。 –

+0

しかし、私は完全に同意します、しかし、私はそれが必要であるよりも "より複雑"にしたくありません。 – MortenMoulder

0
var Person = function(nameOrObj, age, country) { 
    if (typeof nameOrObj === 'object') { 
    this.name = nameOrObj.name 
    this.age = nameOrObj.age 
    this.country = nameOrObj.country 
    } else { 
    this.name = nameOrObj 
    this.age = age 
    this.country = country 
    } 
} 
+0

これは何が間違っていますか? – lipp

+0

誰かがここですべての答えをdownvotedしているようだ:) –

1

可能です。彼らは結局、維持し、文書化し、覚えておくのが難しくなります。コンストラクタは `関数者(OBJある場合

この場合、私はそう

function Person(data) { 
    Object.assign(this, data); 
} 

、オブジェクトを取るコンストラクタのシグネチャを変更したい今、あなたは

var patrick = new Person({name: 'Patrick', age: 25, country: 'US'}); 
var patrick2 = new Person(patrick); 
+0

これはそれを行うための最良の方法になります。絶対に。ありがとう。 – MortenMoulder

関連する問題