通过Javascript的新运算符访问Silverlight的createObject?

时间:2009-08-21 09:37:53

标签: javascript silverlight

随时可以跳到下面的问题

我正在尝试创建一个桥接器,以便巨大的 javascript应用程序可以尽可能顺利地替换为基于Silverlight的新重写。

在遗留应用程序中,有这个JS类:

function LatLng(lat, lng, url) { /* snip... */ }

它在我的客户代码库中被大量使用,如下所示:

var ll = new LatLng(12, 34, '567');

但是,由于Silverlight中的桥接器需要向后兼容并且以最大的可维护性完成,因此我决定在Silverlight中重新创建LatLng类作为ScriptableType:

[ScriptableType]
public class LatLng { /* similar snipped stuff ... */ }

当我在Silverlight / C#中重新实现类中的方法时,一直到asked and implement this delegate util。通过这样做,允许我通过0更改将来自Javascript端的调用直接连接到Silverilght运行时:

var x = new LatLng() // <-- constructor now calls into Silverlight
                     //     and ask for methods to be wired into it

不幸的是,这种方法不适用于属性getter / setters ,因为JavaScript中没有这样的概念(至少在所有主流浏览器中都没有),这是获取属性getter /的唯一方法setter工作就是让Silverlight运行时成为创建我的类

的包装器的运行时

即。必须从JavaScript中的Content.services.createObject创建实例:

var ll = silverlightObject.Content.services.createObject("LatLng");

此单一更改将要求应用程序的所有现有用户重新访问整个代码库以进行升级...一点都不好


问题

  

有没有办法重新连线新的   Javascript中的运算符返回一个   另一个函数的实例   代替?

var ll = new LatLng(13, 100)
/*        ^
          ^
   should returns instance created from
   silverlightObject.Content.services.createObject
*/

还有2个陷阱:

  • createObject是Silverlight管理的功能,Function.applyFunction.call不起作用
  • createObject的结果是一个包装器,你不能迭代它(因此我首先要求委托util)

我希望通过改变LatLng的创建方式,让每个客户都走出去,有一条出路......

如果您有任何想法,请在这里分享,我一直试图在上周解决这个问题无济于事: - (

1 个答案:

答案 0 :(得分:0)

JavaScript中的新命令表示函数的实例,而不实际使用基函数。这对于保护函数的内部机制免受期望重用的干扰非常重要。

为了规避新命令,我将LatLng函数转换为方法。方法是使用点表示法执行的功能,用于修改具有存储值的变量。原始的LatLng函数包含3个参数。重写LatLng重写时只采用前两个参数,以便激活方法的变量可以包含最初的第三个参数。

var ll.LatLng(13,100);

但请记住,变量在对其执行任何方法之前应该有一个值,否则很可能会抛出错误。这就是为什么我建议使用LatLng的原始第三个参数,而不是在使用该方法之前使用变量的值。