Javascript 是否可以修改定义的getter函数?

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) {

在微信微应用平台(基于微信应用的javascript+原生混合版)上开发性能评估工具时,我正在尝试将代码注入其原型,例如
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我还添加了对上述错误的解释。请查收。