diff --git a/facet.js b/facet.js index 3e1495b..8dd82bc 100644 --- a/facet.js +++ b/facet.js @@ -16,6 +16,7 @@ var DatabaseError = require("./errors").DatabaseError, substitute = require("json-schema/lib/validate").substitute, rpcInvoke = require("./json-rpc").invoke; require("./coerce");// patches json-schema +require("./util/ringojs-compat"); // compatibility package for ringojs exports.Facet = Facet; Facet.facetFor = function(store, resolver, mediaType){ @@ -287,7 +288,7 @@ function FacetedStore(store, facetSchema){ } }; - constructor.__proto__ = httpHandlerPrototype; + constructor = Object.setPrototypeOf ( constructor, httpHandlerPrototype ); // TODO: handle immutable proto return constructor; @@ -354,12 +355,14 @@ var SchemaControlled = function(facetSchema, sourceClass, permissive){ var results = LazyArray({ some: function(callback){ source.some(function(item){ - callback((item && typeof item == "object" && wrap(item, transaction, item, true)) || item); + return callback((item && typeof item == "object" && wrap(item, transaction, item, true)) || item); }); }, length: source.length }); results.totalCount = source.totalCount; + if ( source.lazy == false ) + results = results.toRealArray (); return results; } var instancePrototype = Object.create(facetPrototype); @@ -543,6 +546,7 @@ var SchemaControlled = function(facetSchema, sourceClass, permissive){ } } } + for(var i in needSourceParameter){ // splice in the source argument for each method that needs it (function(param, protoFunc, i){ @@ -553,12 +557,12 @@ var SchemaControlled = function(facetSchema, sourceClass, permissive){ })(needSourceParameter[i], facetPrototype[i], i); } if(writableProto && partial === true){ - source.__proto__ = instancePrototype; + source = Object.setPrototypeOf ( source, instancePrototype ); wrapped = source; } else{ if(wrapped){ - wrapped.__proto__ = instancePrototype; + wrapped = Object.setPrototypeOf ( wrapped, instancePrototype ); } else{ wrapped = Object.create(instancePrototype); @@ -627,7 +631,7 @@ function Facet(appliesTo, schema, permissive){ facetedStore = function(){ return facetedStore.construct.apply(facetedStore, arguments); }; - facetedStore.__proto__ = baseFacetedStore; + facetedStore = Object.setPrototypeOf ( facetedStore, baseFacetedStore ); facetedStore.wrap = createWrap(facetedStore); } else{ diff --git a/util/ringojs-compat.js b/util/ringojs-compat.js new file mode 100644 index 0000000..cdf2173 --- /dev/null +++ b/util/ringojs-compat.js @@ -0,0 +1,24 @@ +// Polyfill for __proto__ and Object.setPrototypeOf +// see http://stackoverflow.com/questions/10476560/proto-when-will-it-be-gone-alternatives +// and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf +// and https://github.com/ringo/ringojs/issues/181 +var testobj = {}; +Object.setPrototypeOf = Object.setPrototypeOf || function ( obj, proto ) { + if ( testobj.__proto__ ) { + obj.__proto__ = proto; + return obj; + } + var type = typeof proto; + if ( ( typeof obj == "object" || typeof obj == "function" ) && ( type == "object" || type == "function" ) ) { + var constructor = function ( obj ) { + var ownPropertyNames = Object.getOwnPropertyNames ( obj ); + var length = ownPropertyNames.length; + for ( var i = 0; i < length; i++ ) { + var ownPropertyName = ownPropertyNames[i]; + this[ownPropertyName] = obj[ownPropertyName]; + } + }; + constructor.prototype = proto; + return new constructor(obj); + } else throw new TypeError ( "Expected both the arguments to be objects." ); +} \ No newline at end of file