我有一个像下面这样的构造函数:
var Person = function (name, age) {
this.name = name;
this.age = age;
}
Person.prototype = {
getAgePlusTwo: function () {
return this.age + 2;
}
}
我可以创建这样的对象并访问实例方法:
var p1 = new Person('Person1', 22);
p1.getAgePlusTwo();
但是我从JSON服务获取对象,因此我无法使用new
来创建对象。有没有办法映射像这样的对象文字:
var p2 = { name: 'Person2', age: 25 }
是Person
的一个实例,所以我可以使用像p2.getAgePlusTwo()
这样的实例方法吗?
答案 0 :(得分:2)
如果您可以更改Person
构造函数以接受保留所有信息而不是name
和age
参数的对象,我会这样做:
FIDDLE http://jsfiddle.net/JPQ57/2/
<强> JS 强>
var Person = function (optns) {
if(optns){
this.name = optns.name || "";
this.age = parseInt(optns.age) || 0;
}
}
var json1 = {name: "Person2", age: "22"}
var p2 = new Person(json1);
希望有所帮助
答案 1 :(得分:1)
如果你想要做的就是使用在给定对象p2
上为Person定义的实例方法,你可以做到
Person.prototype.getAgePlusTwo.call(p2)
如果p2
具有getAgePlusTwo
使用的所有必需属性。此外,如果函数接受任何其他参数,则可以在p2
之后传递它们。您可以在MDN
Function.prototype.call
的更多信息
答案 2 :(得分:1)
如果您不想修改构造函数,可以创建工厂函数:
function makePerson(json){
return new Person(json.name,json.age);
}
var p2 = makePerson({name:'Lebowski',age:41});
p2.getAgePlusTwo();
答案 3 :(得分:1)
以通用方式,试试这个:
function parseObject(jsonObject, classToRealize) {
var isCorrect = true;
var comparison = new classToRealize();
var realizedObject = Object.create(classToRealize.prototype);
if (Object.keys(jsonObject).length === Object.keys(comparison).length) {
for (property in comparison) {
if (typeof(comparison[property]) != 'function') {
if(!jsonObject.hasOwnProperty(property)) {
isCorrect = false;
break;
} else {
realizedObject[property] = jsonObject[property];
}
}
}
} else {
isCorrect = false;
}
if (isCorrect)
return realizedObject;
else
return null;
}
它会检查json的数据完整性,并允许您解析任何json数据中的任何对象。如果出现任何错误,它将返回null。我做了JSFiddle来说明它(当你来到页面时它会显示4个警报)。