From 5d463c20c6525bd1ca0aba0ce1668b957cb263ad Mon Sep 17 00:00:00 2001 From: Justin Meyer Date: Thu, 14 Jun 2018 13:34:56 -0500 Subject: [PATCH] fixes IE11's lack of Object.getPrototypeOf working on primitives --- reflections/shape/shape-test.js | 2 ++ reflections/shape/shape.js | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/reflections/shape/shape-test.js b/reflections/shape/shape-test.js index d4a08f1..fc96844 100644 --- a/reflections/shape/shape-test.js +++ b/reflections/shape/shape-test.js @@ -544,6 +544,8 @@ QUnit.test("hasKey", function() { QUnit.ok(shapeReflections.hasKey(55, "toFixed") , "works on primitives"); QUnit.ok(shapeReflections.hasKey(true, "valueOf") , "works on primitives"); QUnit.ok(shapeReflections.hasKey('foo', "length") , "works on primitives"); + QUnit.notOk(shapeReflections.hasKey(null, "length") , "works on null"); + QUnit.notOk(shapeReflections.hasKey(undefined, "length") , "works on undefined"); }); QUnit.test("serialize clones", function(){ diff --git a/reflections/shape/shape.js b/reflections/shape/shape.js index 8e054f6..d339832 100644 --- a/reflections/shape/shape.js +++ b/reflections/shape/shape.js @@ -3,6 +3,16 @@ var getSetReflections = require("../get-set/get-set"); var typeReflections = require("../type/type"); var helpers = require("../helpers"); + + +var getPrototypeOfWorksWithPrimitives = true; +try { + Object.getPrototypeOf(1); +} catch(e) { + getPrototypeOfWorksWithPrimitives = false; +} + + var ArrayMap; if(typeof Map === "function") { ArrayMap = Map; @@ -982,15 +992,17 @@ shapeReflections = { * @param {String} key The key to look up on `obj` * @return {Boolean} `true` if `obj`'s key set contains `key` or an object on its prototype chain's key set contains `key`, `false` otherwise */ - "hasKey": function(obj, key) { + hasKey: function(obj, key) { + if( obj == null ) { + return false; + } if (typeReflections.isPrimitive(obj)) { if (Object.prototype.hasOwnProperty.call(obj, key)) { return true; } else { - return key in Object.getPrototypeOf(obj); + return key in (getPrototypeOfWorksWithPrimitives ? Object.getPrototypeOf(obj) : obj.__proto__); } } - var hasKey = obj[canSymbol.for("can.hasKey")]; if(hasKey) { return hasKey.call(obj, key);