mirror of
https://github.com/protobufjs/protobuf.js.git
synced 2025-12-08 20:58:55 +00:00
178 lines
5.5 KiB
JavaScript
178 lines
5.5 KiB
JavaScript
// This file exists for testing purposes but can also be used as a reference for polyfilling non-ES5 environments.
|
|
// ref: https://github.com/inexorabletash/polyfill/blob/master/es5.js (public domain)
|
|
|
|
// ES5 15.2.3.5 Object.create ( O [, Properties] )
|
|
if (typeof Object.create !== "function") {
|
|
Object.create = function (prototype, properties) {
|
|
if (typeof prototype !== "object") { throw TypeError(); }
|
|
function Ctor() {}
|
|
Ctor.prototype = prototype;
|
|
var o = new Ctor();
|
|
if (prototype) { o.constructor = Ctor; }
|
|
if (properties !== undefined) {
|
|
if (properties !== Object(properties)) { throw TypeError(); }
|
|
Object.defineProperties(o, properties);
|
|
}
|
|
return o;
|
|
};
|
|
}
|
|
|
|
// ES 15.2.3.6 Object.defineProperty ( O, P, Attributes )
|
|
// Partial support for most common case - getters, setters, and values
|
|
(function() {
|
|
if (!Object.defineProperty ||
|
|
!(function () { try { Object.defineProperty({}, 'x', {}); return true; } catch (e) { return false; } } ())) {
|
|
var orig = Object.defineProperty;
|
|
Object.defineProperty = function (o, prop, desc) {
|
|
// In IE8 try built-in implementation for defining properties on DOM prototypes.
|
|
if (orig) { try { return orig(o, prop, desc); } catch (e) {} }
|
|
|
|
if (o !== Object(o)) { throw TypeError("Object.defineProperty called on non-object"); }
|
|
if (Object.prototype.__defineGetter__ && ('get' in desc)) {
|
|
Object.prototype.__defineGetter__.call(o, prop, desc.get);
|
|
}
|
|
if (Object.prototype.__defineSetter__ && ('set' in desc)) {
|
|
Object.prototype.__defineSetter__.call(o, prop, desc.set);
|
|
}
|
|
if ('value' in desc) {
|
|
o[prop] = desc.value;
|
|
}
|
|
return o;
|
|
};
|
|
}
|
|
}());
|
|
|
|
// ES 15.2.3.7 Object.defineProperties ( O, Properties )
|
|
if (typeof Object.defineProperties !== "function") {
|
|
Object.defineProperties = function (o, properties) {
|
|
if (o !== Object(o)) { throw TypeError("Object.defineProperties called on non-object"); }
|
|
var name;
|
|
for (name in properties) {
|
|
if (Object.prototype.hasOwnProperty.call(properties, name)) {
|
|
Object.defineProperty(o, name, properties[name]);
|
|
}
|
|
}
|
|
return o;
|
|
};
|
|
}
|
|
|
|
// ES5 15.2.3.14 Object.keys ( O )
|
|
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys
|
|
if (!Object.keys) {
|
|
Object.keys = function (o) {
|
|
if (o !== Object(o)) { throw TypeError('Object.keys called on non-object'); }
|
|
var ret = [], p;
|
|
for (p in o) {
|
|
if (Object.prototype.hasOwnProperty.call(o, p)) {
|
|
ret.push(p);
|
|
}
|
|
}
|
|
return ret;
|
|
};
|
|
}
|
|
|
|
// ES5 15.4.3.2 Array.isArray ( arg )
|
|
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
|
|
if (!Array.isArray)
|
|
Array.isArray = function (o) { return Boolean(o && Object.prototype.toString.call(Object(o)) === '[object Array]'); };
|
|
|
|
// ES5 15.4.4.14 Array.prototype.indexOf ( searchElement [ , fromIndex ] )
|
|
// From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
|
|
if (!Array.prototype.indexOf) {
|
|
Array.prototype.indexOf = function (searchElement /*, fromIndex */) {
|
|
if (this === void 0 || this === null) { throw TypeError(); }
|
|
|
|
var t = Object(this);
|
|
var len = t.length >>> 0;
|
|
if (len === 0) { return -1; }
|
|
|
|
var n = 0;
|
|
if (arguments.length > 0) {
|
|
n = Number(arguments[1]);
|
|
if (isNaN(n)) {
|
|
n = 0;
|
|
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
|
|
n = (n > 0 || -1) * Math.floor(Math.abs(n));
|
|
}
|
|
}
|
|
|
|
if (n >= len) { return -1; }
|
|
|
|
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
|
|
|
|
for (; k < len; k++) {
|
|
if (k in t && t[k] === searchElement) {
|
|
return k;
|
|
}
|
|
}
|
|
return -1;
|
|
};
|
|
}
|
|
|
|
// ES5 15.4.4.18 Array.prototype.forEach ( callbackfn [ , thisArg ] )
|
|
// From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach
|
|
if (!Array.prototype.forEach) {
|
|
Array.prototype.forEach = function (fun /*, thisp */) {
|
|
if (this === void 0 || this === null) { throw TypeError(); }
|
|
|
|
var t = Object(this);
|
|
var len = t.length >>> 0;
|
|
if (typeof fun !== "function") { throw TypeError(); }
|
|
|
|
var thisp = arguments[1], i;
|
|
for (i = 0; i < len; i++) {
|
|
if (i in t) {
|
|
fun.call(thisp, t[i], i, t);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
// ES5 15.4.4.19 Array.prototype.map ( callbackfn [ , thisArg ] )
|
|
// From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Map
|
|
if (!Array.prototype.map) {
|
|
Array.prototype.map = function (fun /*, thisp */) {
|
|
if (this === void 0 || this === null) { throw TypeError(); }
|
|
|
|
var t = Object(this);
|
|
var len = t.length >>> 0;
|
|
if (typeof fun !== "function") { throw TypeError(); }
|
|
|
|
var res = []; res.length = len;
|
|
var thisp = arguments[1], i;
|
|
for (i = 0; i < len; i++) {
|
|
if (i in t) {
|
|
res[i] = fun.call(thisp, t[i], i, t);
|
|
}
|
|
}
|
|
|
|
return res;
|
|
};
|
|
}
|
|
|
|
// ES5 15.4.4.20 Array.prototype.filter ( callbackfn [ , thisArg ] )
|
|
// From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Filter
|
|
if (!Array.prototype.filter) {
|
|
Array.prototype.filter = function (fun /*, thisp */) {
|
|
if (this === void 0 || this === null) { throw TypeError(); }
|
|
|
|
var t = Object(this);
|
|
var len = t.length >>> 0;
|
|
if (typeof fun !== "function") { throw TypeError(); }
|
|
|
|
var res = [];
|
|
var thisp = arguments[1], i;
|
|
for (i = 0; i < len; i++) {
|
|
if (i in t) {
|
|
var val = t[i]; // in case fun mutates this
|
|
if (fun.call(thisp, val, i, t)) {
|
|
res.push(val);
|
|
}
|
|
}
|
|
}
|
|
|
|
return res;
|
|
};
|
|
}
|