anchor.diff:        for (var key in keys) {
           dartMap[key] = dartValue(jsValue[key]);
         }
  +      _jsMapExpando[dartMap] = jsValue;
         addDartInstance(jsValue, dartMap);
         return dartMap;
       }
  
positive.code:   if (dartValue is JsProxyInterface) {
      return dartValue.jsProxy;
    } else if (dartValue is Iterable) {
      var newList = jsArrayExpando[dartValue];
      if (newList==null) {
        newList = new JsArray.from(dartValue.map((item) => jsValue(item)));
        jsArrayExpando[dartValue] = newList;
        addDartInstance(newList, dartValue);
      }
      return newList;
    } else if (dartValue is Map) {
      var newMap = new JsObject(_Object);
      dartValue.forEach((k, v) {
        newMap[k] = jsValue(v);
      });
      addDartInstance(newMap, dartValue);
      return newMap;
    } else if (dartValue is DateTime) {
      return new JsObject(_Date, [dartValue.millisecondsSinceEpoch]);
  
negative.code:   JsObject get jsProxy;
  }
  
  Expando<JsArray> _jsArrayExpando = new Expando<JsArray>();
  Expando<JsObject> _jsMapExpando = new Expando<JsObject>();
  
  /// Converts a dart value to a js value, using proxies when possible.
  /// TODO(jakemac): Use expando to cache js arrays that mirror dart lists?
  