javascript中强类型容器的更好选择

时间:2010-07-16 17:12:51

标签: javascript arrays oop class object

我刚刚发现了在javascript中创建假“类”的方法,但我想知道如何存储它们并且仍然可以在IDE中轻松访问它们的功能。

像这样:

function Map(){
   this.width = 0;
   this.height = 0;
   this.layers = new Layers();
}

现在我有了一个循环XML并创建多个Map()对象的函数。 如果我将它们存储在单个变量下,我可以很好地访问它们,例如:

map1 = new Map();
map1.height = 1;

但我不知道他们将以什么名义存储! 所以我想我可以像这样保存它们:

mapArray = {};
mapArray['map1'] = new Map();

但你无法访问这样的函数:(至少IDE代码完成不会提取它)

mapArray['map1'].height = 1;

然后我认为这将是最好的解决方案:

function fetch(name){
    var fetch = new Map();
    fetch = test[name];
}

我可以这样写:

fetch('test').height = 1;

但这似乎会产生大量开销,不断复制像这样的变量。

我忽略了一些简单的事情吗?

2 个答案:

答案 0 :(得分:4)

它不起作用的原因是,为了使map / array允许其中的任何内容,它必须只假设内部的东西在继承树上最多是一个非常低级的东西。不幸的是,与ActionScript中的Vector<>和代理对象以及其他语言中的类似内容不同,这在Javascript中并不容易。

How would you overload the [] operator in javascript

您拥有的解决方案,如果这是您想要的功能,那么您可以做的最简单。您还可以创建一个.get(whatever)函数,它返回[whatever]的内容,但特别是您想要的类型。你也可以制作一个.set(whatever,value)。但是,它不会阻止代码使用[]推送内容。

一方面,过分依赖IDE来为你做这件事并不是一个好主意,但尝试强力打字更好的事情本身并不是一个坏主意。

更新

回答你的另一个问题......首先,要轻松测试简单的JS,最好使用命令行版本:

http://blog.thefrontside.net/javascript/learning-javascript-from-the-command-line

https://developer.mozilla.org/en/SpiderMonkey_Build_Documentation

现在,我也不建议你这样做只是为了破解IDE,而只是为了表明“办法”:

# js
js> function FooDataClass(){ this.data = "argh!"; }
js> function FooClass(){ this.get = GetStuff; this.put = PutStuff; this.stuff = new FooDataClass(); }
js> function PutStuff(name,stuff){ this[name]= this.stuff = stuff; }    
js> function GetStuff(name){ return this.stuff = this[name]; }     
js> f = new FooClass()       
[object Object]
js> f.put('bar', new FooDataClass())       
js> f.get('bar')    
[object Object]
js> f.get('bar').data
argh!
js> 

这个可能为你伪造了你的IDE。

答案 1 :(得分:1)

另一种方法是使用编译为JavaScript的强类型语言。 ST-JS是一个Maven插件,它与Eclipse集成,允许您用Java编写代码。每次保存文件时都会生成相应的JavaScript代码。通过使用Java作为原始语言,IDE可以很好地支持代码自动完成,重构,浏览执行路径。

您不需要学习太多,因为您需要知道的API正是您在JavaScript中使用的API:DOM或jQuery。只有他们以强烈的方式呈现。