Лучший вариант для строго типизированных контейнеров в JavaScript - PullRequest
5 голосов
/ 16 июля 2010

Я только что открыл способ создания фальшивых «классов» в 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 ]

4 голосов
/ 16 июля 2010

Причина, по которой это не работает, состоит в том, что для того, чтобы карта / массив позволяли что-либо внутри него, она должна предполагать только то, что вещи внутри являются не более чем низкоуровневой вещью в дереве наследования. К сожалению, в отличие от Vector<> и прокси-объектов в Actionscript и подобных вещей в других языках, это не так просто сделать в Javascript.

Как бы вы перегрузили оператор [] в 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 голос
/ 10 марта 2012

Еще один способ - использовать строго типизированный язык, который компилируется в JavaScript. ST-JS - это плагин Maven, который также интегрируется с Eclipse, что позволяет вам писать свой код на Java. Соответствующий код JavaScript генерируется каждый раз, когда вы сохраняете свой файл. Благодаря использованию Java в качестве исходного языка автоматическое заполнение кода, рефакторинг, просмотр путей выполнения очень хорошо поддерживаются вашей IDE.

Вам не нужно много учиться, так как API, которые вам нужно знать, это именно те, которые вы использовали бы в JavaScript: DOM или jQuery. Только то, что они представлены строго типизированным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...