Javascript 是否可以修改定义的getter函数?
在微信微应用平台(基于微信应用的javascript+原生混合版)上开发性能评估工具时,我正在尝试将代码注入其原型,例如Javascript 是否可以修改定义的getter函数?,javascript,wechat,Javascript,Wechat,在微信微应用平台(基于微信应用的javascript+原生混合版)上开发性能评估工具时,我正在尝试将代码注入其原型,例如wx.request函数 这是如何使用wx.request功能: wx.request({ url: 'test.php', data: { x: '' , y: '' }, header: { 'content-type': 'application/json' }, success: function(res) {
wx.request
函数
这是如何使用wx.request
功能:
wx.request({
url: 'test.php',
data: {
x: '' ,
y: ''
},
header: {
'content-type': 'application/json'
},
success: function(res) {
console.log(res.data)
}
})
Object.defineProperty(wx, 'request', {
get: function() {
return function() {
//...
};
}
});
因此,为了知道在不手动写入并添加所有锚的情况下请求花费了多长时间,我尝试通过以下方式注入代码:
var owxrequest = wx.request
wx.request = function() {
console.log('test', Date.now())
return owxrequest.apply(owxrequest, arguments)
}
这失败了,我得到了一个#的无法设置属性“prop”,它只有一个getter
错误
因此我意识到对象的定义必须类似于:
wx = {
request: get function(){
...
}
...
}
所以我试着:
var owxrequest = wx.request
Object.defineProperty(wx, 'request', {
get: function() {
console.log('test', Date.now())
return owxrequest.apply(owxrequest, arguments)
}
})
此操作失败,出现错误(请求:失败参数错误:parameter.url应为字符串,而不是未定义的
)。然后我试着:
var owxrequest = wx.request
Object.defineProperty(wx, 'request', {
set: function() {
console.log('test', Date.now())
return owxrequest.apply(owxrequest, arguments)
}
})
这不会引发错误,但在调用
wx.request()
..时也没有效果。您可以只隐藏request
函数。
简单的例子:
跟踪getter:
//原始getter最新版本
设基数={
数目:1,,
获取最新信息{
返回这个.num;
}
}
console.log(base.latest);
//阴影吸气剂最新版本
Object.defineProperty(基,'latest'{
get:function(){
返回this.num+1;
}
});
console.log(base.latest)代码>您可以通过重新定义getter来实现这一点。要点是:重新定义的getter应该返回一个函数对象,如wx。request
是一个函数:
wx.request({
url: 'test.php',
data: {
x: '' ,
y: ''
},
header: {
'content-type': 'application/json'
},
success: function(res) {
console.log(res.data)
}
})
Object.defineProperty(wx, 'request', {
get: function() {
return function() {
//...
};
}
});
获取错误的原因:请求:失败参数错误:parameter.url应该是字符串而不是未定义的
您正在尝试访问getter本身的参数
(get:function(){…}
中函数的参数
)。此参数
为空对象,可通过console.log()
语句验证。由于它是空的,arguments.url
未定义,这就是wx抱怨该参数的原因
以下是一个工作示例:
let wx = {
get request(){
return function() {
console.log(10);
return 88;
};
}
};
let oldF = wx.request;
Object.defineProperty(wx, 'request', {
get: function() {
return function() {
console.log(new Date());
return oldF.apply(wx, arguments);
};
}
});
console.log(wx.request());
上述代码将打印:
2017-08-28T06:14:15.583Z // timestamp
10
88
如果我不关心保留原始的
wx.request
函数,这将起作用,但在这里我确实需要保留它(无法访问原始代码,因此我不知道完成请求所需的密钥和加密算法)。感谢澄清。我不清楚您是否没有访问原始代码的权限。在这种情况下,我可以建议看一下面向方面的编程,它可能很难跟踪代码的执行时间@AeroWang我还添加了对上述错误的解释。请查收。