如果传递给它的参数是JavaScript Map的实例,我正在编写一个返回true
的函数。
您可能已经猜到typeof new Map()
会返回字符串object
,而我们也不会获得方便的Map.isMap
方法。
这是我到目前为止所做的:
function isMap(v) {
return typeof Map !== 'undefined' &&
// gaurd for maps that were created in another window context
Map.prototype.toString.call(v) === '[object Map]' ||
// gaurd against toString being overridden
v instanceof Map;
}
(function test() {
const map = new Map();
write(isMap(map));
Map.prototype.toString = function myToString() {
return 'something else';
};
write(isMap(map));
}());
function write(value) {
document.write(`${value}<br />`);
}
&#13;
到目前为止一切顺利,但在测试帧之间的地图以及覆盖toString()
时,isMap
失败(I do understand why)。
例如:
<iframe id="testFrame"></iframe>
<script>
const testWindow = document.querySelector('#testFrame').contentWindow;
// false when toString is overridden
write(isMap(new testWindow.Map()));
</script>
Here is a full Code Pen Demonstrating the issue
有没有办法编写isMap
函数,以便它返回true
何时覆盖toString
并且地图对象来自另一个框架?
答案 0 :(得分:3)
您可以查看Object.prototype.toString.call(new testWindow.Map)
。
如果已被覆盖,那么你可能运气不好。