Feature/fix perf

/to @ritch 
/to @bajtos 

Here are a few patterns I use:

1. Convert array.forEach(fn) to for(var k = 0; k < keys.length; k++) {...};
See: http://jsperf.com/fast-array-foreach

2. Avoid Object.defineProperty()
See: http://jsperf.com/object-defineproperty-vs-definegetter-vs-normal/21

3. Avoid array.indexOf() 
I was trying to push the properties to the prototype. There are two styles:

1. Define properties with getter/setter that delegates to instance properties. Then we still need corresponding instance properties to hold the values. For example,

```
Object.defineProperty(ModelBaseClass, '__data', {
  get: function() {
    return this.$__data;
  },
  set: function(val) {
    this.$__data = val;
  }
});
```

$__data is now enumerable on the instance.

2. Define properties with value (no setter/getter). It is functionally broken as the properties will be shared by multiple instances of the same model.