如何将原型应用于现有对象

时间:2014-04-14 07:16:54

标签: javascript prototype typescript

我有一个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"); 
     

}

3 个答案:

答案 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来做到这一点。