Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Checks that `toString` of constructor's prototype has "special" behavior (i.e. is `Object.prototype.toString`) as per
- Relies on `constructor` property of an object (as well as `toString` of constructor's prototype) being present and not augmented
(will fail on host objects in IE that lack constructor, but could be guarded against)
- Does not differentiate between Object objects created implicitly via function constructor and those created explicitly via Object
- Does not rely on func. decomp.
- Should work across windows and in any ES3 compliant implementation
<!DOCTYPE html>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<!-- Online here: -->
li { background: green; } li.FAIL { background: red; }
iframe { display: none; }
<ul id="results"></ul>
function isObjectLiteral(obj) {
var _toString = obj.constructor.prototype.toString;
try {
return[]) === '[object Array]';
} catch(e) {
return false;
// Function serialization is not permitted
// Does not work across all browsers
Function.prototype.toString = function(){};
log("{}", {}, true);
log("new Date", new Date, false);
var fn = function(){};
log("fn", fn, false);
log("new fn", new fn, false);
var iframe = document.createElement("iframe");
var doc = iframe.contentDocument || iframe.contentWindow.document;;
doc.write("<body onload=';'>");
function iframeDone(otherObject){
log("new otherObject", new otherObject, true);
function log(msg, a, b) {
var pass = isObjectLiteral(a) === b ? "PASS" : "FAIL";
document.getElementById("results").innerHTML +=
"<li class='" + pass + "'>" + msg + "</li>";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment