Более оптимальный вариант для контейнеров со строгим контролем типов в JavaScript

Я только что обнаружил способ создать поддельные 'классы' в JavaScript, но интересно, как можно сохранить их и все еще получить легкий доступ к их функциям в IDE.

Как это:

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

Теперь у меня есть функция, что циклы через XML и создают несколько Карта () объекты. Если я храню их под единственной переменной, я могу получить доступ к ним очень хорошо, как:

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;

Но это кажется, что генерирует много служебных непрерывно переменные копирования как этот.

Я пропускаю что-то простое?

5
задан skerit 16 July 2010 в 18:37
поделиться

1 ответ

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

Как бы вы перегрузили оператор [] в javascript

Решение, которое у вас есть, если вам нужна такая функциональность, является самым простым из возможных. Вы также можете создать функцию .get (something) , которая возвращает то, что есть [something] , но конкретно того типа, который вам нужен. И вы также можете создать .set (что угодно, значение) . Однако это не остановит код от использования [].

С одной стороны, не стоит слишком сильно полагаться на среду 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 для вас.

4
ответ дан 14 December 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: