我有一个REST API,它返回一个JSON对象数组(联系人)。
在我的应用程序中,我有一个Contact类,它定义了常用的属性和一堆方法(例如。hasAPhoneNumber()=>boolean
)。
除了将属性转录为新的Contact对象之外,我如何将每个REST对象提升为我的Contact类的实例?
我正在使用TypeScript,以防有特定于TS的方法,或者普通的旧JS也可以。
所以,我希望能够做到这一点......
// fetch the contacts var contactsArray = fetchContactsFromRestApi(); // do something to each contact so it becomes an instance of Contact xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // use the newly applied method(s) if (contactsArray[2].hasAPhoneNumber() == false) { alert("sorry you can't call "+contactsArray[2].name+ " because he/she has no phone number");
}
答案 0 :(得分:3)
您已经有了JSON对象数组,它们应该将“Contact”作为原型。 因此,首先要创建一个Contact对象。
var cont = new Contact(); //the prototype object
现在将其作为原型添加到每个对象。
//if contacts is the JSON array
contacts.forEach(function(jsonObj){
jsonObj.__proto__ = cont;
jsonObj.constructor = Contact;
});
现在,json数组的每个对象都将具有相同的Contact原型。 这不是添加原型的聪明方法,但是你说你不想再次实例化那些JSON对象。因此,这将达到目的。
答案 1 :(得分:0)
似乎没有优雅的方法来做到这一点。我不想使用弃用的属性( proto ),而较新的ES6替代品也不赞成使用。
我采用的方法是简单地使用一个静态的ContactsMethods类,例如我的hasAPhoneNumber()
所以而不是
contactsArray [2] .hasAPhoneNumber()
我最终会以
结束ContactsMethods.hasAPhoneNumber(contactsArray [2])
imho不太可读,但避免(a)使用非推荐技术,以及(b)克隆数组。
我不会接受我自己的答案,希望有一个更好的方法,但如果有人有同样的困境,那么这就是完整性。
答案 2 :(得分:0)
您似乎可以使用the Object.setPrototypeOf
method来做到这一点。