我有一个包含iframe(相同来源)的窗口,因此来自此iframe的脚本只需引用top.foo
即可访问顶部窗口的属性。我想授予对其中一些属性的访问权限,并通过黑名单隐藏其他属性。
这是我到目前为止所做的:
(function(){
var private = PrivateObject;
Object.defineProperty(window, 'PrivateObject', {
get: function getter() {
if (!(getter.caller instanceof Function)) {
throw 'You can\'t access PrivateObject from the iframe';
}
return private;
},
set: function setter(x) {
if (!(setter.caller instanceof Function)) {
throw 'You can\'t access PrivateObject from the iframe';
}
private = x;
},
});
})();
这背后的基本思想是f.caller instanceof Function
应该检测来自外部窗口对象的调用,因为window1.Function !== window2.Function
。
但如果从顶级代码调用访问器f.caller === null
,那么does not work。{{1}}。任何解决方案?