我试图通过使用已经创建的对象来创建一个新对象。这就是我想要实现的目标:
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"
}
}
意味着age
和country
设置为空,而name
设置为我的对象。
答案 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
}
}