Страницы: 1
Сабж. Имеем такой самописный XPCOM-компонент (ниже приведенный код - тестовый, в реальности всё несколько сложнее, но суть вопроса от от этого не изменяется):
#include "nsISupports.idl" interface nsIFoo; [function, scriptable, uuid (5bfd9830-5604-40cb-8891-20875f73bc5f)] interface nsIFooMethod : nsISupports { void bar(); }; [scriptable, uuid(d551ecc5-4657-4ba1-922d-c4a4c5b38a7d)] interface nsIFoo : nsISupports { void testApply(in nsIFooMethod aMethod); };
Реализация компонента:
const { classes: Cc, interfaces: Ci, utils: Cu, Constructor: CC } = Components; Cu.import("resource://foo/utils.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); function Foo() {} Foo.prototype= { classDescription: "Foo XPCOM", contractID: "@cycledlm/foo-service;1", classID: Components.ID("{027bf398-cacb-4615-84fc-ad4fe3f677b5}"), QueryInterface: XPCOMUtils.generateQI([Ci.nsIFoo]), applyContext: null, // некоторые действия по формированию applyContext .... testApply: function(aMethod) { aMethod.bar.apply(this.applyContext); // самописный утилитный метод для // вывода внутреннего содержимого объекта utils.dumpMembers(this.applyContext); } }; const NSGetFactory=XPCOMUtils.generateNSGetFactory([Foo]);
и далее в коде вызываем метод:
Components.classes["@cycledlm/foo-service;1"] .getService(Components.interfaces.nsIFoo) .testApply(function(){...});
Вроде бы всё в порядке - передаваемый метод отрабатывает. Только вот при apply() происходит привязка совсем не к тому контексту, к какому надо. К какому контексту в действительности происходит привязка - не знаю.
Например, в чистом javascript результат отработки
var ns={}; var obj=(function() { this.foo="bar"; this.toString=function(){ return "["+this.foo+"]";}; }).apply(ns); utils.dumpMembers(ns);
будет таким:
foo = bar
------------------------
toString = function (){...}
Отредактировано hydrolizer (13-06-2011 09:35:52)
Отсутствует
Страницы: 1