Javascript构造函数 - 使用对象?

时间:2016-05-30 08:04:11

标签: javascript constructor

我试图通过使用已经创建的对象来创建一个新对象。这就是我想要实现的目标:

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/

正如你所看到的,我正在努力创建一个名叫帕特里克的新人,25岁,他碰巧住在美国。我的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"
    }
}

意味着agecountry设置为空,而name设置为我的对象。

4 个答案:

答案 0 :(得分: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
}

更好使用工厂函数并尽可能保持构造函数代码

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)
}

答案 1 :(得分:1)

一般来说,最好避免使用多态接口。它们最终难以维护,记录和记忆。

在这种情况下,我会更改构造函数的签名以获取对象,所以

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

现在您可以将其称为

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

答案 2 :(得分: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;
    }

答案 3 :(得分: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
  }
}