【问题标题】:Better option for strongly-typed containers in javascriptjavascript中强类型容器的更好选择
【发布时间】:2011-03-17 02:07:38
【问题描述】:

我刚刚发现了在 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;

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

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

【问题讨论】:

  • 你真的要依赖 IDE 代码补全吗?
  • -1 很抱歉,您需要在浏览器中测试您的 JS,而不是在 IDE 中!
  • 这与代码是否正确无关,我知道它是正确的,但它不会像那样自动完成,我只是想知道是否有更好的方法来做到这一点。
  • +1:来吧,伙计们,这不是一个愚蠢的问题,他只是在学习。在程序创建/程序测试学习阶段克服这个障碍很重要。而且他并不是唯一一个渴望强类型容器的人,是吗?人们会觉得这是一个无用的请求吗?
  • @skerit: 同时删除标题前面的“javascript:”。当标签放在标题的前面时,这里的一些人会变得小气。只是我经常看到的一个奇怪的讨厌鬼。

标签: javascript arrays oop class object


【解决方案1】:

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

您不需要学习太多,因为您需要了解的 API 正是您将在 JavaScript 中使用的那些:DOM 或 jQuery。只是它们以强类型的方式呈现。

【讨论】:

    【解决方案2】:

    它不起作用的原因是,为了让 map/array 允许其中的任何内容,它必须仅假设其中的内容至多是继承树上非常低级的内容。不幸的是,与 Vector<> 和 Actionscript 中的代理对象以及其他语言中的类似内容不同,这在 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。

    【讨论】:

    • 哦,像“function fetch(name){this.get = function(){alert('Name: ' + maps[name]);};}”?嗯,当您调用 fetch("something").get; 时,这似乎不起作用(或 .get())。还是我必须先创建一个变量?
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2014-12-19
    相关资源
    最近更新 更多