私は多かれ少なかれスパイダーモンキーであるGNOME javascriptであるjavascriptを書いています。これは、spidermonkey の外部で実行されることのないSpidermonkey コードと考えてください。そのため、ブラウザー間の互換性などについて心配する必要はありません。
基本的に、サブクラス化できないFolks.Individual
クラスがありますが、いくつかのゲッターを追加して、パッチを適用するだけでサブクラス化をシミュレートしたいと考えています。(興味のある方は、gobject イントロスペクションを介して取得される a であり、私のバージョンの GJS では a をサブクラス化できません)。GObject
GObject
ノート:
contactSys.get_individual(contactID)
Folks.Individual
I'm patching を返します- いくつかの値を返す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)
返されます(ゲッターとして)。contact
email
aliasText
online
これが私が現時点で行った方法です。私の質問は、これが「適切な」方法ですか?withinthis
の代わりに使用する必要がありますか? 代わりに何かをして、それを と呼ぶべきですか?contact
Contact()
Folks.Individual.prototype
Contact
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)
ので、サブクラスであるかのように扱うことができるように、ラッパー関数を使用してそのインスタンスにパッチを適用することで解決します。これを行う標準的な方法があるかどうかを知りたいだけです。
乾杯!