2017-01-10 53 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) {...} 
相关问题