在Js中,对于普通的对象,你可以通过下列方法来增加/修改/删除一个实例属性
obj = new Object;
// 增加属性
obj.name = 123;
// 修改属性
obj.name = 321;
//删除属性
delete obj.name
但是对于浏览器的navigator对象,却无法通过上述方式对属性进行操作
针对navigator对象,你可以采用下列的方式来操作它的属性
Object.defineProperty(obj, 'key', { //descriptor })
这个属性可以是添加或修改现有的属性,obj就是要修改的对象,key就是属性名,descriptor是一个对象,用来表明新添属性的一些特性,包括6个参数:
- configurable: 默认false,表示此属性是否可用delete删除
- enumerable:默认为false,表示此属性是否可被for...in、Object.keys遍历到
- value:默认undefined,此属性的值,可以是任何JavaScript类型
- writable:默认为false,此属性是否可被改写
- get: 默认undefined,指定一个函数,当属性被调用时,此函数也被调用,默认为返回属性值
- set:默认undefined,指定一个函数,当属性被赋值时,此函数也被调用,仅接受一个参数,参数为属性被赋的值
例如修改navigator的webdriver的值:
Object.defineProperty(window.navigator, 'webdriver', {value:'123'})
注:不知道为什么,我把webdriver的configurable的改为true后会自动删除这个属性
属性被删除后再调用value会报错,需要先把属性添加回来
添加的方法可以用
Object.defineProperty(window.navigator, 'webdriver', {get:function(){return 123}})
函数调用的时候会返回123,这个时候也可以用value属性来操作它
对于function(){return 123} 我们可以采用ES6中新增的箭头函数来执行(相当于匿名函数(类似于python中的lambda))
Object.defineProperty(window.navigator, 'webdriver', {get:()=>123)