blob: 8801eb8b4d7dcf1bf3ac67ebf64efd72f6fa3d33 [file] [log] [blame]
// This file tests the functionality of Symbol.hasInstance.
// Test a custom Symbol.hasInstance on a function object.
function Constructor(x) {}
foo = new Constructor();
if (!(foo instanceof Constructor))
throw "should be instanceof";
Object.defineProperty(Constructor, Symbol.hasInstance, {value: function(value) {
if (this !== Constructor)
throw "|this| should be Constructor";
if (value !== foo)
throw "first argument should be foo";
return false;
} });
if (foo instanceof Constructor)
throw "should not be instanceof";
// Test Symbol.hasInstance on an ordinary object.
ObjectClass = {}
ObjectClass[Symbol.hasInstance] = function (value) {
return value !== null && (typeof value === "object" || typeof value === "function");
}
if (!(foo instanceof ObjectClass))
throw "foo should be an instanceof ObjectClass";
if (!(Constructor instanceof ObjectClass))
throw "Constructor should be an instanceof ObjectClass";
NumberClass = {}
NumberClass[Symbol.hasInstance] = function (value) {
return typeof value === "number";
}
if (!(1 instanceof NumberClass))
throw "1 should be an instanceof NumberClass";
if (foo instanceof NumberClass)
throw "foo should be an instanceof NumberClass";
// Test the Function.prototype[Symbol.hasInstance] works when actually called.
descriptor = Object.getOwnPropertyDescriptor(Function.prototype, Symbol.hasInstance);
if (descriptor.writable !== false || descriptor.configurable !== false || descriptor.enumerable !== false)
throw "Function.prototype[Symbol.hasInstance] has a bad descriptor";
if (!Function.prototype[Symbol.hasInstance].call(Constructor, foo))
throw "Function.prototype[Symbol.hasInstance] should claim that foo is an instanceof Constructor";