Skip to content

Commit

Permalink
finally gets a working Model.instanceOf on IE9
Browse files Browse the repository at this point in the history
simplified Model.Array instanciation
  • Loading branch information
sylvainpolletvillard committed Mar 19, 2015
1 parent 93e6574 commit d49199c
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 24 deletions.
15 changes: 5 additions & 10 deletions src/array-model.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ var ARRAY_MUTATOR_METHODS = ["pop", "push", "reverse", "shift", "sort", "splice"
Model.Array = function ArrayModel(def){

var model = function() {
var array = cloneArray(arguments);
if(!(this instanceof model)){
return new (Function.prototype.bind.apply(model, [null].concat(array)));
}

var array = cloneArray(arguments),
proxy = [];

model.validate(array);
var proxy = this;

ARRAY_MUTATOR_METHODS.forEach(function (method) {
Object.defineProperty(proxy, method, { configurable: true, value: function() {
Expand All @@ -23,11 +21,8 @@ Model.Array = function ArrayModel(def){
});

proxifyKeys(proxy, array, Object.keys(array), model);
Object.defineProperty(proxy, "length", {
enumerable: false,
get: function(){ return array.length; }
});
inherits(proxy, model);
inherits(proxy, model, model.prototype);

return proxy;
};

Expand Down
16 changes: 13 additions & 3 deletions src/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,19 +63,29 @@ function merge(base, ext, replace){
var canSetProto = !!Object.setPrototypeOf || {__proto__:[]} instanceof Array;
Object.setPrototypeOf = Object.setPrototypeOf || (canSetProto
? function(o, p){ o.__proto__ = p; }
: function(o, p){ for(var k in p){ o[k] = p[k]; } });
: function(o, p){ for(var k in p){ o[k] = p[k]; } ensureProto(o, p); });

Object.getPrototypeOf = Object.getPrototypeOf && canSetProto ? Object.getPrototypeOf : function(o){
return o.__proto__ || (o.constructor ? o.constructor.prototype : null);
};

function instanceofsham(obj, Constructor){
return canSetProto
? obj instanceof Constructor
: (function recursive(o, stack){
if(o == null || !o.constructor || stack.indexOf(o) !== -1){ return false; }
var proto = o.constructor.prototype;
if(o == null || stack.indexOf(o) !== -1){ return false; }
var proto = Object.getPrototypeOf(o);
stack.push(o);
return proto === Constructor.prototype || recursive(proto, stack);
})(obj, [])
}

function ensureProto(o, p){
if(!canSetProto){
Object.defineProperty(o, "__proto__", { enumerable: false, writable: true, value: p });
}
}

function inherits(model, constructor, proto){
model.prototype = proto || model.prototype || {};
model.prototype.constructor = model;
Expand Down
9 changes: 5 additions & 4 deletions src/model.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
function Model(def){
if(!isLeaf(def)) return new Model.Object(def);
if(!isLeaf(def)) return Model.Object(def);

var model = function(obj) {
model.validate(obj, []);
return obj;
};

inherits(model, Model, Object.create(isFunction(def) ? def.prototype : Object.prototype));
model.definition = def;
model.assertions = [];
inherits(model, Model, Object.create(isFunction(def) ? def.prototype : Object.prototype));
model.definition = def;
model.assertions = [];
return model;
}

Expand All @@ -26,6 +26,7 @@ Model.prototype.validate = function(obj, stack){
Model.prototype.extend = function(){
var submodel = new this.constructor(mergeDefinitions(this.definition, arguments));
submodel.prototype = Object.create(this.prototype);
ensureProto(submodel.prototype, this.prototype);
submodel.prototype.constructor = submodel;
submodel.assertions = cloneArray(this.assertions);
return submodel;
Expand Down
15 changes: 8 additions & 7 deletions src/object-model.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@ Model.Object = function ObjectModel(def){
}
merge(this, obj, true);
var proxy = getProxy(model, this, model.definition);
model.validate(proxy, []);
model.validate(proxy, []);
ensureProto(proxy, model.prototype);
return proxy;
};

inherits(model, ObjectModel, Object.create(Object.prototype));
model.definition = def;
model.assertions = [];
inherits(model, ObjectModel, Object.create(Object.prototype));
model.definition = def;
model.assertions = [];
return model;
};

Expand Down Expand Up @@ -46,10 +47,10 @@ function getProxy(model, obj, defNode, path) {
}
var newProxy = getProxy(model, val, defNode[key], newPath);
checkModel(newProxy, defNode[key], newPath, []);
var oldValue = wrapper[key];
var oldValue = wrapper[key];
wrapper[key] = newProxy;
try { matchAssertions(obj, model.assertions); }
catch(e){ wrapper[key] = oldValue; throw e; }
try { matchAssertions(obj, model.assertions); }
catch(e){ wrapper[key] = oldValue; throw e; }
},
enumerable: (key[0] !== "_")
});
Expand Down

0 comments on commit d49199c

Please sign in to comment.