diff --git a/reflections/shape/shape-test.js b/reflections/shape/shape-test.js index f50214d..d4a08f1 100644 --- a/reflections/shape/shape-test.js +++ b/reflections/shape/shape-test.js @@ -540,6 +540,10 @@ QUnit.test("hasKey", function() { objHasOwnKey.bar = "baz"; QUnit.ok(shapeReflections.hasKey(objHasOwnKey, "bar") , "returns true when hasOwnKey Symbol returns false but `in` returns true"); + + 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.test("serialize clones", function(){ diff --git a/reflections/shape/shape.js b/reflections/shape/shape.js index d971bc3..8e054f6 100644 --- a/reflections/shape/shape.js +++ b/reflections/shape/shape.js @@ -983,6 +983,14 @@ shapeReflections = { * @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) { + if (typeReflections.isPrimitive(obj)) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + return true; + } else { + return key in Object.getPrototypeOf(obj); + } + } + var hasKey = obj[canSymbol.for("can.hasKey")]; if(hasKey) { return hasKey.call(obj, key);