2017-01-10 52 views
2

我有一個具有各種字段的構造函數對象;舉個簡單的例子,比如說如何將構造函數對象中的方法應用於任意對象

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

現在,我有一個任意的對象與標識和名稱字段

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

我想從somePerson實例數據注入到一個人的構造函數,所以我可以應用Person類中的所有方法,但我在apply,call和bind之間感到困惑。

我知道我可以調用一個新的構造函數傳遞所有的字段,但是有很多字段。是否有任何簡單的方法來賦予somePerson實例與Person類中的方法?

回答

1

我想你理解錯了,你正在嘗試做的是:

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

,那麼你就可以寫:

somePerson.someFunction(); 
1

您需要創建一個新的Person例如,沒有必要使用callapply

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()並分配somePerson對象的屬性的Person

實例

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

您的意思是否變種P = Object.assign(新的Person(),somePerson) –

+0

可以省略括號,如果你不打算提供參數。 –

+1

該解決方案的問題在於,它不適用於*需要*參數的構造函數。我建議總是使用一個特定於類的輔助方法,比如'Person.fromJSON'(它知道如何/是否調用它的構造函數)。 – Bergi

0

當然這是怎麼回事;

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

它的一些例子被使用。

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

Person設置像constructor function。您需要使用new關鍵字來實例化Person的新副本。

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

現在joe將是Person一個實例。

joe instanceof Person //true 
joe.id //123 
joe.someFunction //function (xxx) {...} 
相關問題