Mypal/js/src/builtin/Object.js

205 lines
4.8 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// ES6 draft rev36 2015-03-17 19.1.2.1
function ObjectStaticAssign(target, firstSource) {
// Steps 1-2.
var to = ToObject(target);
// Step 3.
if (arguments.length < 2)
return to;
// Steps 4-5.
for (var i = 1; i < arguments.length; i++) {
// Step 5.a.
var nextSource = arguments[i];
if (nextSource === null || nextSource === undefined)
continue;
// Steps 5.b.i-ii.
var from = ToObject(nextSource);
// Steps 5.b.iii-iv.
var keys = OwnPropertyKeys(from, JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS);
// Step 5.c.
for (var nextIndex = 0, len = keys.length; nextIndex < len; nextIndex++) {
var nextKey = keys[nextIndex];
// Steps 5.c.i-iii. We abbreviate this by calling propertyIsEnumerable
// which is faster and returns false for not defined properties.
if (callFunction(std_Object_propertyIsEnumerable, from, nextKey)) {
// Steps 5.c.iii.1-4.
to[nextKey] = from[nextKey];
}
}
}
// Step 6.
return to;
}
// ES stage 4 proposal
function ObjectGetOwnPropertyDescriptors(O) {
// Step 1.
var obj = ToObject(O);
// Step 2.
var keys = OwnPropertyKeys(obj, JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS);
// Step 3.
var descriptors = {};
// Step 4.
for (var index = 0, len = keys.length; index < len; index++) {
var key = keys[index];
// Steps 4.a-b.
var desc = std_Object_getOwnPropertyDescriptor(obj, key);
// Step 4.c.
if (typeof desc !== "undefined")
_DefineDataProperty(descriptors, key, desc);
}
// Step 5.
return descriptors;
}
/* ES6 draft rev 32 (2015 Feb 2) 19.1.2.9. */
function ObjectGetPrototypeOf(obj) {
return std_Reflect_getPrototypeOf(ToObject(obj));
}
/* ES6 draft rev 32 (2015 Feb 2) 19.1.2.11. */
function ObjectIsExtensible(obj) {
return IsObject(obj) && std_Reflect_isExtensible(obj);
}
/* ES2015 19.1.3.5 Object.prototype.toLocaleString */
function Object_toLocaleString() {
// Step 1.
var O = this;
// Step 2.
return callContentFunction(O.toString, O);
}
// ES 2017 draft bb96899bb0d9ef9be08164a26efae2ee5f25e875 19.1.3.7
function Object_valueOf() {
// Step 1.
return ToObject(this);
}
// ES7 draft (2016 March 8) B.2.2.3
function ObjectDefineSetter(name, setter) {
// Step 1.
var object = ToObject(this);
// Step 2.
if (!IsCallable(setter))
ThrowTypeError(JSMSG_BAD_GETTER_OR_SETTER, "setter");
// Step 3.
var desc = {
__proto__: null,
enumerable: true,
configurable: true,
set: setter
};
// Step 4.
var key = ToPropertyKey(name);
// Step 5.
std_Object_defineProperty(object, key, desc);
// Step 6. (implicit)
}
// ES7 draft (2016 March 8) B.2.2.2
function ObjectDefineGetter(name, getter) {
// Step 1.
var object = ToObject(this);
// Step 2.
if (!IsCallable(getter))
ThrowTypeError(JSMSG_BAD_GETTER_OR_SETTER, "getter");
// Step 3.
var desc = {
__proto__: null,
enumerable: true,
configurable: true,
get: getter
};
// Step 4.
var key = ToPropertyKey(name);
// Step 5.
std_Object_defineProperty(object, key, desc);
// Step 6. (implicit)
}
// ES7 draft (2016 March 8) B.2.2.5
function ObjectLookupSetter(name) {
// Step 1.
var object = ToObject(this);
// Step 2.
var key = ToPropertyKey(name)
do {
// Step 3.a.
var desc = std_Object_getOwnPropertyDescriptor(object, key);
// Step 3.b.
if (desc) {
// Step.b.i.
if (callFunction(std_Object_hasOwnProperty, desc, "set"))
return desc.set;
// Step.b.ii.
return undefined;
}
// Step 3.c.
object = std_Reflect_getPrototypeOf(object);
} while (object !== null);
// Step 3.d. (implicit)
}
// ES7 draft (2016 March 8) B.2.2.4
function ObjectLookupGetter(name) {
// Step 1.
var object = ToObject(this);
// Step 2.
var key = ToPropertyKey(name)
do {
// Step 3.a.
var desc = std_Object_getOwnPropertyDescriptor(object, key);
// Step 3.b.
if (desc) {
// Step.b.i.
if (callFunction(std_Object_hasOwnProperty, desc, "get"))
return desc.get;
// Step.b.ii.
return undefined;
}
// Step 3.c.
object = std_Reflect_getPrototypeOf(object);
} while (object !== null);
// Step 3.d. (implicit)
}