【发布时间】:2012-10-03 21:06:34
【问题描述】:
我目前有一个基于全局 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 var一切都存在,并破坏了整个应用程序?是否可以保护这个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
我想到的可能的解决方案:
假设我们只是使用框架来解决这个问题。提供的
Apis 现在彼此分开。但是,如果我有许多Widgets 正在运行,并且它们无法再与小部件的“主机”(框架所在的页面)通信,那么在一次又一次加载Api时会有额外的开销,例如,我可能想告诉宿主显示一个通知:Api.Notify.Show("Test"),但它不能这样做,因为这个Api完全独立于其他实例,它无法与“宿主”通信使用诸如“getter”和“setter”之类的函数来读取和写入 Api。我不确定如何实现这一点,因此欢迎就如何实现这一点提供任何帮助!
1/2的混合物?
【问题讨论】:
-
我不是 JS 大师——但我认为仅靠 JS 是无法做到的。也许看看 MS 的新“TypeScript”,它有更好的语言特性,可以编译成 JS,也许这可以让你保护它。
-
是的,我不认为有任何万无一失的方法可以避免全局被第三方脚本(甚至是您自己的脚本)破坏,但有一件事我会建议为您的对象使用不太可能被其他脚本使用的名称。
var TFQ = {}可能比Api更不容易发生冲突。 -
你可以试试这个:stackoverflow.com/questions/1759987/…。也许它有帮助..;.
标签: javascript html object