亲爱的社区问候,
我的目标是欺骗屏幕对象属性,但我不能只是使用以下方法覆盖属性:
window.screen[property] = number;
或Object.defineProperty(...)
因为这些属性是只读。
因此我想克隆或重新创建屏幕对象,操纵属性然后覆盖整个window.screen对象。
我的尝试:
var clone = Object.create(Screen.prototype);
Object.assign(clone, window.screen);
console.log(clone);

原型克隆良好,但不是属性。
在尝试使用Object.getOwnPropertyNames
和Object.keys
函数(它们不起作用(example here)后,它们必须在原型中。
所以我尝试了这个:
var clone = Object.create(Screen.prototype);
Object.assign(clone,Object.getPrototypeOf(window.screen));
console.log(clone);

输出错误" TypeError:' get availWidth'调用了一个没有实现界面屏幕的对象。"
使用for-in循环进行迭代并分配它们会输出相同的错误。
所以我似乎必须实现界面屏幕,即使我不确定我的计划是否在此之后工作。也许存在一种更简单的解决方案。
其他想法:
我可以将完整的屏幕对象指定为原型(如Object.create(screen)
),然后在对象上设置自己的属性,但原始值仍然可读。
也许我也可以通过Screen(...)
接口以某种方式创建对象?
感谢您的帮助和想法!
答案 0 :(得分: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])