2016-09-24 68 views
0

问候亲爱的社区,操纵/更改window.screen属性值

我的目标是欺骗屏幕对象的属性,但我不能只需使用覆盖属性: window.screen[property] = number;Object.defineProperty(...) 因为这些属性为只读

因此,我想克隆或重新创建屏幕对象,操纵属性,然后覆盖整个window.screen对象。

我尝试:

var clone = Object.create(Screen.prototype); 
 
Object.assign(clone, window.screen); 
 
console.log(clone);

的原型克隆很好,但不是性能。 在尝试使用Object.getOwnPropertyNamesObject.keys函数获得它们(example here)后,它们必须位于原型中。 所以,我想这一点:

var clone = Object.create(Screen.prototype); 
 
Object.assign(clone,Object.getPrototypeOf(window.screen)); 
 
console.log(clone);

其输出误差“类型错误:‘获得availWidth’调用的对象没有实现界面屏幕上”

使用for-in循环进行迭代并分配它们确实会输出相同的错误。

所以看起来我必须实现界面屏幕,即使我不确定我的计划是否在那之后工作。也许存在一个更简单的解决方案。

其他的想法:

我可以分配完整的画面对象作为原型(像Object.create(screen)),然后在对象上设置自己的属性,但随后的原始值仍然可读。

也许我也可以通过使用Screen(...)接口创建一个对象?

感谢您的帮助和意见!

回答

0

只要属性是可配置的,似乎可以通过Object.defineProperty()方法的帮助轻松实现。

var exampleProperty = 'colorDepth', 
 
    exampleValue = 55; 
 
    
 
console.log("before:", screen[exampleProperty])  
 

 
Object.defineProperty(screen, exampleProperty, { 
 
    // add descriptor properties here if desired 
 
    value: exampleValue 
 
}); 
 

 

 
console.log("after:", screen[exampleProperty])