2016-09-24 69 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])