我正在编写一些 GNOME javascript 的 javascript,它或多或少是蜘蛛猴。将其视为永远不会在 spidermonkey 之外运行的 spidermonkey 代码,因此无需担心跨浏览器兼容性等问题。
基本上我有一个不可Folks.Individual
子类化的类,但我想通过修补它来模拟子类化它,向它添加一些吸气剂。(对于那些感兴趣的人,它是通过 gobject 自省获得的,在我的 GJS 版本中,你不能继承 a )。GObject
GObject
笔记:
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)
它,它会返回修补contact
的email
,aliasText
和online
属性(尽管作为吸气剂)。
这就是我目前所做的。我的问题是,这是“正确”的做法吗?我应该使用this
而不是contact
withinContact()
吗?我应该做些什么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)
这样我就可以把它当作一个子类来对待。我只是想知道是否有这样做的标准方法。
干杯!