如何将对象文字映射为构造函数的实例?

时间:2014-02-08 18:22:39

标签: javascript prototype

我有一个像下面这样的构造函数:

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()这样的实例方法吗?

4 个答案:

答案 0 :(得分:2)

如果您可以更改Person构造函数以接受保留所有信息而不是nameage参数的对象,我会这样做:

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();

Fiddle here

答案 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个警报)。