3

私は多かれ少なかれスパイダーモンキーであるGNOME javascriptであるjavascriptを書いています。これは、spidermonkey の外部で実行されることのないSpidermonkey コードと考えてください。そのため、ブラウザー間の互換性などについて心配する必要はありません。

基本的に、サブクラス化できないFolks.Individualクラスがありますが、いくつかのゲッターを追加して、パッチを適用するだけでサブクラス化をシミュレートしたいと考えています。(興味のある方は、gobject イントロスペクションを介して取得される a であり、私のバージョンの GJS では a をサブクラス化できません)。GObjectGObject

ノート:

  • contactSys.get_individual(contactID)Folks.IndividualI'm patching を返します
  • いくつかの値を返すgetter emailaliasText、およびを追加します。online
  • 私はこのクラスを 経由で使用し、単純に であるかのようlet contact = new Contact(id);に使用したいだけでなく、追加のプロパティにパッチを適用します。contactFolks.Individual
  • パッチを適用したいプロパティが動的でない場合は、次のようにします。

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

上記に関する便利な関数が必要なだけで、呼び出すことができ、 、、およびプロパティがパッチされてlet contact = new Contact(contactID)返されます(ゲッターとして)。contactemailaliasTextonline

これが私が現時点で行った方法です。私の質問は、これが「適切な」方法ですか?withinthisの代わりに使用する必要がありますか? 代わりに何かをして、それを と呼ぶべきですか?contactContact()Folks.Individual.prototypeContact

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

At the very least you can probably do 'online' a bit more succinctly and efficiently:

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 に答える