我在JavaScript中有一个包装器函数,它为嵌入在网页中的.Net控件提供了一些有用的方法。 为了享受intellisense的好处,我想在每次使用包装器时重新包装控件。 (如果我将其包装一次并将其设置为全局变量,则下次在另一个函数中使用它时会丢失智能感知 - 至少在Visual Studio 2008中会失败:
function onLoad() {
var control = new Wrapper(form1.button1);
control.SetColor("Red");
// etc.
}
function onButton_Clicked() {
var control = new Wrapper(form1.button1);
control.SetBackColor("Blue");
// etc.
}
因此,为了避免每次为同一个控件重新创建包装器,我首先检查它是否已经创建,如果是,则返回该实例。下面是伪JavaScript代码:
function Wrapper(control) {
var i = Wrapper.Controls.IndexOf(control);
if (i >-1) { return Wrapper.Wrappers[i] };
// Init stuff
Wrapper.Controls.Push(control);
Wrapper.Wrappers.Push(this);
}
Wrapper.prototype.SetColor = function(color) {}
Wrapper.prototype.SetBackColor = function(color) {}
...
Wrapper.Controls = new Array();
Wrapper.Wrappers = new Array();
如果可以做我正在做的事情?有没有办法制作静态变量,Wrapper.Controls& Wrapper.Wrappers,私有?
答案 0 :(得分:0)
而不是与.NET控件的交互。 (不知道AFWebControl是什么)我建议你与DOM交互。
您可以使用DOM操作库或原始js。
document.getElementById(id).style.color = ...;
或
$("#id").css("color", ...)
等待。这是服务器端的JavaScript使用ASP吗?如果是的话,请将其标记为服务器端。
要真正回答你的问题:
var cachedfunction = (function() {
var cache = {};
return function(arg) {
return cache[arg] || (cache[arg] = expensivefunction(arg));
}
}());
这里我们创建一个带有本地缓存变量的动态函数。该函数要么从缓存中返回对象,要么在缓存中设置对象(通过昂贵的调用)然后返回它。