blob: c8880f653b0c8961fadbcc3e26a5030c2ab4b592 [file] [log] [blame]
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/ */
// Like other primitives, symbols can be treated as objects, using object-like
// syntax: `symbol.prop` or `symbol[key]`.
//
// In ECMAScript spec jargon, this creates a Reference whose base value is a
// primitive Symbol value.
var symbols = [
Symbol(),
Symbol("ponies"),
Symbol.for("sym"),
Symbol.iterator
];
// Test accessor property, used below.
var gets, sets;
Object.defineProperty(Symbol.prototype, "prop", {
get: function () {
"use strict";
gets++;
assertEq(typeof this, "object");
assertEq(this instanceof Symbol, true);
assertEq(this.valueOf(), sym);
return "got";
},
set: function (v) {
"use strict";
sets++;
assertEq(typeof this, "object");
assertEq(this instanceof Symbol, true);
assertEq(this.valueOf(), sym);
assertEq(v, "newvalue");
}
});
for (var sym of symbols) {
assertEq(sym.constructor, Symbol);
// method on Object.prototype
assertEq(sym.hasOwnProperty("constructor"), false);
assertEq(sym.toLocaleString(), sym.toString()); // once .toString() exists
// custom method monkeypatched onto Symbol.prototype
Symbol.prototype.nonStrictMethod = function (arg) {
assertEq(arg, "ok");
assertEq(this instanceof Symbol, true);
assertEq(this.valueOf(), sym);
return 13;
};
assertEq(sym.nonStrictMethod("ok"), 13);
// the same, but strict mode
Symbol.prototype.strictMethod = function (arg) {
"use strict";
assertEq(arg, "ok2");
assertEq(this, sym);
return 14;
};
assertEq(sym.strictMethod("ok2"), 14);
// getter/setter on Symbol.prototype
gets = 0;
sets = 0;
var propname = "prop";
assertEq(sym.prop, "got");
assertEq(gets, 1);
assertEq(sym[propname], "got");
assertEq(gets, 2);
assertEq(sym.prop = "newvalue", "newvalue");
assertEq(sets, 1);
assertEq(sym[propname] = "newvalue", "newvalue");
assertEq(sets, 2);
// non-existent property
assertEq(sym.noSuchProp, undefined);
var noSuchPropName = "nonesuch";
assertEq(sym[noSuchPropName], undefined);
// non-existent method
assertThrowsInstanceOf(() => sym.noSuchProp(), TypeError);
assertThrowsInstanceOf(() => sym[noSuchPropName](), TypeError);
}
if (typeof reportCompare === "function")
reportCompare(0, 0);