2017-01-10 7 views
2

私はさまざまなフィールドを持つコンストラクタオブジェクトを持っています。簡単な例では、今コンストラクタオブジェクトから任意のオブジェクトにメソッドを適用する方法

function Person(id, name) { 
    this.id = id; 
    this.name = name; 
    etc. 
    this.someFunction = function(xxx) {...} 
} 

を言って、私はidとnameフィールドに任意のオブジェクトを持って

var somePerson = {id:123, name:"joe"} 

私は、人のコンストラクタにsomePersonインスタンスからのデータを挿入したいです私はPersonクラスからすべてのメソッドを適用できますが、適用、呼び出し、およびバインドの間で混乱します。

すべてのフィールドを渡す新しいコンストラクタを呼び出すことができますが、多くのフィールドがあります。 SomePersonインスタンスにPersonクラスのメソッドを与えるだけの簡単な方法はありますか?

答えて

1

私は何をしようとする、あなたはそれが間違っだと思うのです:

var somePerson = new Person(123, 'joe'); 

、あなたが書くことができるようになります:

somePerson.someFunction(); 
1

あなたは新しいPersonインスタンスを作成する必要があり、 callまたはapplyを使用する必要はありません。

var somePerson = {id:123, name:"joe"}; 
var somePersonInstance = new Person(somePerson.id, somePerson.name); 
somePersonInstance.someFunction(xxx); 

メソッドがコンストラクタ内なかった場合は、callを使用することもできましたが、プロトタイプに:

function Person(id, name) { 
    this.id = id; 
    this.name = name; 
} 
Person.prototype.someFunction = function(xxx) {…}; 

var somePerson = {id:123, name:"joe"}; 
Person.prototype.someFunction.call(somePerson, xxx); 
1

あなたはObject.assign()を使用することができますし、Person

のインスタンスに somePersonオブジェクトのプロパティを割り当てます

function Person(id, name) { 
 
    this.id = id; 
 
    this.name = name; 
 
    this.someFunction = function() { 
 
    return this.name; 
 
    } 
 
} 
 

 
var somePerson = {id:123, name:"joe"} 
 
var p = Object.assign(new Person, somePerson) 
 

 
console.log(p.someFunction())

+0

あなたは引数を指定するつもりはない場合は、括弧を省略でき –

+0

のvar P = Object.assign(新しい人()、somePerson)を意味しました。 –

+1

このソリューションの問題点は、引数を必要とするコンストラクタでは機能しないことです。 'Person.fromJSON'(コンストラクタの呼び出し方法を知っている)など、クラス固有のヘルパーメソッドを常に使用することをお勧めします。 – Bergi

0

確かです。

function PersonFactory(id, name) { 
    return { 
     id: id, 
     name: name, 
     updateName: function(name) { 
      this.name = name 
     } 
    } 
} 

一部のexmaplesが使用されています。

var somePerson = PersonFactory(1, "Luke") 

var people = { 
    luke: PersonFactory(1, "Luke"), 
    will: PersonFactory(2, "Will"), 
    smith: PersonFactory(3, "Smith") 
} 

var persons = [ 
PersonFactory(1, "Luke"), 
PersonFactory(1, "Will"), 
PersonFactory(1, "Smith") 
] 

people.luke.updateName("Harry"); 
0

Personconstructor functionのように設定されています。 Personの新しいコピーをインスタンス化するには、newキーワードを使用する必要があります。今

var joe = new Person(somePerson.id, somePerson.name); 

joePersonのインスタンスになります。

joe instanceof Person //true 
joe.id //123 
joe.someFunction //function (xxx) {...} 
関連する問題