Причина, по которой это не работает, состоит в том, что для того, чтобы карта / массив позволяли что-либо внутри него, она должна предполагать только то, что вещи внутри являются не более чем низкоуровневой вещью в дереве наследования. К сожалению, в отличие от 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 для вас.