2014-02-08 11 views
3

我有一個構造函數如下圖所示:如何映射一個對象文字作爲我的構造函數的一個實例?

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

回答

2

如果你可以改變Person構造函數接受保留的所有信息,而不是nameage PARAMS一個對象,我會這麼做:

FIDDLEhttp://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); 

希望它有幫助

+0

這對於單個對象來說很好,但是對於從JSON服務中獲得的數千個對象來說,這樣做感覺很尷尬。 –

+0

抱歉,我不明白你的意思。從JSON服務中,您將收到一系列信息,對不對?如{[{名稱:「約翰」,年齡:「25」},{姓名:「彼得」,年齡:「35」},...]} – BeNdErR

1

如果你想要做的是使用一個給定物體上的人定義的實例方法p2你可以簡單地做

Person.prototype.getAgePlusTwo.call(p2) 

提供p2具有所有getAgePlusTwo用途所需的性能。此外,如果該函數採用任何附加參數,則可以在p2之後傳遞它們。您可以閱讀MDN

1

更多關於Function.prototype.call如果你不想修改你可以創建一個工廠函數的構造:

function makePerson(json){ 
    return new Person(json.name,json.age); 
} 

var p2 = makePerson({name:'Lebowski',age:41}); 
p2.getAgePlusTwo(); 

Fiddle here

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條警報)。

相關問題