在补环境过程中遇到了 Object.getOwnPropertyDescriptor(HTMLElement.prototype,'offsetHeight')
然后我第一反应是结果是
但是如果这样写的话,就会全局多出一个offsetHeight方法,但是浏览器中是没有的,所以又到思考了另外一种方法
但是采用这种的话,那么就会导致以下问题:
先看浏览器中的输出:
然后看看我们自己的环境输出:
就会发现我们的.get和get.toString()方法有问题,然后就想着去修改一些
然后本以为这样就结束啦,但是呢,又有一个新的问题
就差个toString的无限循环,然后又在去研究至尊宝大佬写的保护函数的代码,发现大佬还得是大佬,写得真好。爱了爱了。
最后的效果就是这样的:
但是后面发现,是有问题的,因为可以通过HTMLElement.prototype.offsetHeight
获得值,所以经过查看this,然后去看真实的页面如何调用的,就发现了,他这个方法是实例(此实例的原型对象上必须有这个方法)调用的才能成功,如果原型调用就不会成功,所以我们就添加一个判断就能实现了。如图:
还有亿点问题,就是这里的条件判断应该为
!this.hasOwnProperty('offsetHeight') && this.constructor.name!='Object'
而不是 this.prototype=='undefined'
还有不足就是目前的条件只能判断
HTMLElement.prototype.offsetHeight
Object.getOwnPropertyDescriptor(HTMLElement.prototype,'offsetHeight').get()
这两种取值方法不合法,如果遇到其他的,条件可能还要写。不知道其他大佬是否有其他好的方法,能否请大佬留言指教一下。
效果如下:
但是还有瑕疵的地方就是每次返回的值是固定的,不过到时候可以根据具体情况修改一下。