我目前有一个基于全局Javascript API运行的Web应用程序,并且初始化如下:
var Api = {
someVar: "test",
someFunction: function() {
return "foo";
}
}
这个API被许多“小部件”共享,它们都存在于Web应用程序中,并且它们都应该从这个单独的 Api
实例运行,以便它们可以相互传递数据。
AJAX目前用于加载这些小部件,例如在widgets/mywidget.html中,并且放置在<div id ='widget_<random number>'> ... </div>
中。
代码中的某些其他部分可能会选择为 Api
添加更多功能,目前是这样完成的:
Api.myExtension = {
myNewFunction: function() {
return "bar";
}
}
然而,这种用法存在一些问题:
问题一:如果一个小部件(可能由第三方提供)决定隐藏某些代码,并执行类似于
Api = {}
的操作,破坏全局变量Api
,从而破坏整个应用程序怎么办?有没有可能保护这个Api
变量不被外部覆盖?只允许“扩展”(添加新内容),但不允许“删除/更改”。例如:Api.foo = { test: "bar" } // allowed
Api.someVar = "changing the existing someVar"; // not allowed
以下代码位于“内部”
Api
中,例如:var Api = {
Debug: {
Messages = new Array,
Write: function() {
Api.Debug.Messages.push("test"); // allowed
}
}
}
Api.Debug.Messages.push("test 2"); // not allowed
我想到的解决方案:
我们可以使用框架来解决这个问题。提供的
Api
现在是相互独立的。但是,如果我有多个运行的Widget
,就需要反复加载Api
,这会增加额外的开销,并且它们无法再与小部件的“主机”(包含框架的页面)进行通信。例如,我可能希望告诉主机显示通知:Api.Notify.Show("测试")
,但它无法这样做,因为这个Api
完全独立于其他实例,无法与“主机”通信。使用类似“getter”和“setter”的函数来读取和写入
Api
。但我不确定如何实现,希望能得到实现方向上的帮助!1/2 的混合?
var TFQ = {}
可能比Api
更不容易冲突。 - ultranaut