我目前有一个运行全局基于 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";
}
}
但是,这种用法会产生一些问题:
问题一:如果一个 Widget(这些可能由第三方提供)决定在其中隐藏一些代码,并执行类似的操作Api = {}
,破坏所有存在的全局Api
变量,并破坏整个应用程序怎么办?是否可以保护此Api
变量不被外部覆盖?只允许“扩展”(添加新事物),但不允许“删除/更改”。IE:
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
s 现在彼此分开。但是,Api
如果我有很多 s 正在运行,那么在一次又一次加载时会有额外的开销Widget
,并且它们无法再与小部件的“主机”(框架所在的页面)通信,例如,我可能想告诉主机显示通知:Api.Notify.Show("Test")
,但它不能这样做,因为这Api
完全独立于其他实例,并且它无法与“主机”通信使用诸如“getter”和“setter”之类的函数来读取和写入 Api。我不确定如何实现这一点,因此欢迎就如何实现这一点提供任何帮助!
1/2的混合物?