3

我正在编写一些 GNOME javascript 的 javascript,它或多或少是蜘蛛猴。将其视为永远不会在 spidermonkey 之外运行的 spidermonkey 代码,因此无需担心跨浏览器兼容性等问题。

基本上我有一个不可Folks.Individual子类化的类,但我想通过修补它来模拟子类化它,向它添加一些吸气剂。(对于那些感兴趣的人,它是通过 gobject 自省获得的,在我的 GJS 版本中,你不能继承 a )。GObjectGObject

笔记:

  • contactSys.get_individual(contactID)返回Folks.Individual我正在修补
  • 我添加了一些 getter email, aliasText, 并online返回一些值。
  • 我通过 使用这个类let contact = new Contact(id);,只是想把contact它当作一个使用Folks.Individual,加上我修补的额外属性。
  • 如果我要修补的属性不是动态的,我会这样做:

    let contact = contactSys.get_individual(contactID);
    contact.email = ....;
    contact.aliasText = ....;
    contact.online = ....;
    

我只是想要一个关于上述内容的便利函数,这样我就可以调用let contact = new Contact(contactID)它,它会返回修补contactemail,aliasTextonline属性(尽管作为吸气剂)。

这就是我目前所做的。我的问题是,这是“正确”的做法吗?我应该使用this而不是contactwithinContact()吗?我应该做些什么Folks.Individual.prototype而不是把它称为 aContact吗?

function Contact (contactID) {                                                  
    let contactSys = Shell.ContactSystem.get_default(),                         
        contact    = contactSys.get_individual(contactID); // <-- this is a Folks.Individual
    contact._contactSys = contactSys;                                           

    /* these are defined as getters in case the underlying values change */     
    Object.defineProperty(contact, 'email', {get: function () {                 
        return contact._contactSys.get_email_for_display(this);                 
    }});                                                                        
    Object.defineProperty(contact, 'aliasText', {get: function () {             
        return contact.alias     ||                                             
               contact.full_name ||                                             
               contact.nickname  ||                                             
               contact.email     ||                                             
               _("Unknown");                                                    
    }});                                                                        
    Object.defineProperty(contact, 'online', {get: function () {                
        return contact.presence_type === Folks.PresenceType.AVAILABLE ||        
               contact.presence_type === Folks.PresenceType.AWAY ||             
               contact.presence_type === Folks.PresenceType.EXTENDED_AWAY ||    
               contact.presence_type === Folks.PresenceType.BUSY;               
    }});                                                                        
    return contact;                                                             
}                 

记住——我不能继承 Folks.Individual,所以我会用一个包装函数来修补它的实例,new Contact(contactID)这样我就可以把它当作一个子类来对待。我只是想知道是否有这样做的标准方法。

干杯!

4

1 回答 1

1

至少您可以更简洁有效地进行“在线”操作:

var ONLINE = Folks.PresenceType.AVAILABLE |
              Folks.PresenceType.AWAY |
              Folks.PresenceType.EXTENDED_AWAY |
              Folks.PresenceType.BUSY;

Object.defineProperty(contact, 'online', {
  get: function(){ return (this.presence_type & ONLINE) > 0 }
});
于 2012-07-04T07:40:55.250 回答