This test makes sure that instance of behaves correctly when the value, constructor, or its prototype are immediates.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS (1 instanceof 1) threw exception TypeError: Right hand side of instanceof is not an object.
PASS ({} instanceof 1) threw exception TypeError: Right hand side of instanceof is not an object.
PASS (obj instanceof 1) threw exception TypeError: Right hand side of instanceof is not an object.
PASS (1 instanceof {}) threw exception TypeError: {} is not a function. (evaluating '1 instanceof {}').
PASS ({} instanceof {}) threw exception TypeError: {} is not a function. (evaluating '{} instanceof {}').
PASS (obj instanceof {}) threw exception TypeError: {} is not a function. (evaluating 'obj instanceof {}').
PASS (1 instanceof Constructor) is false
PASS ({} instanceof Constructor) is false
PASS (obj instanceof Constructor) is true
PASS (1 instanceof Constructor) is false
PASS ({} instanceof Constructor) threw exception TypeError: instanceof called on an object with an invalid prototype property..
PASS (obj instanceof Constructor) threw exception TypeError: instanceof called on an object with an invalid prototype property..
PASS (1 instanceof Constructor) is false
PASS ({} instanceof Constructor) is false
PASS (obj instanceof Constructor) is false
PASS (1 instanceof Constructor) is false
PASS ({} instanceof Constructor) threw exception TypeError: instanceof called on an object with an invalid prototype property..
PASS (obj instanceof Constructor) threw exception TypeError: instanceof called on an object with an invalid prototype property..
PASS successfullyParsed is true

TEST COMPLETE

