2017-08-28 65 views
0

在微信微型应用平台(基于微信应用的javascript +本地混合)上开发性能评测工具,我试图在其原型中注入代码,例如wx.request函数。是否可以修改定义的getter函数?

这是你将如何使用wx.request功能:

wx.request({ 
    url: 'test.php', 
    data: { 
    x: '' , 
    y: '' 
    }, 
    header: { 
     'content-type': 'application/json' 
    }, 
    success: function(res) { 
    console.log(res.data) 
    } 
}) 

所以为了知道请求了多长时间拍摄,而无需手动编写将所有的锚,我试图注入的代码:

var owxrequest = wx.request 
wx.request = function() { 
    console.log('test', Date.now()) 
    return owxrequest.apply(owxrequest, arguments) 
} 

这失败了,我得到了Cannot set property "prop" of #<Object> which has only a 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) 
    } 
}) 

这个错误而失败(request: fail parameter error: parameter.url should be String instead of Undefined)。然后我想:

var owxrequest = wx.request 
Object.defineProperty(wx, 'request', { 
    set: function() { 
    console.log('test', Date.now()) 
    return owxrequest.apply(owxrequest, arguments) 
    } 
}) 

这会不会引发错误,但调用wx.request()时也没有效果...

回答

1

你可以通过重新定义getter来实现这个。问题的关键是:重新定义的getter应该返回一个函数对象,为wx.request是一个函数:

Object.defineProperty(wx, 'request', { 
    get: function() { 
    return function() { 
     //... 
    }; 
    } 
}); 

为什么我得到的错误:request: fail parameter error: parameter.url should be String instead of Undefined

您试图访问吸气本身的arguments(的功能get: function(){...}arguments)。这arguments是一个空的对象,它可以通过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 
+0

这就是你如何定义一个吸气剂,我明白了! –

+0

@AeroWang我也为问题中提到的错误添加了解释。请检查。 – shaochuancs

0

你可以只遮蔽的request功能。 简单的例子:

如影随形吸气剂:

// original getter latest 
 
let base = { 
 
    num: 1, 
 
    get latest() { 
 
    return this.num; 
 
    } 
 
} 
 
console.log(base.latest); 
 

 
// shadowing getter latest 
 
Object.defineProperty(base, 'latest', { 
 
    get: function() { 
 
    return this.num + 1; 
 
    } 
 
}); 
 

 
console.log(base.latest);

简单阴影一个对象属性

// your original object 
 
let base = { 
 
    request(){ 
 
     console.log('request original'); 
 
    } 
 
}; 
 

 
base.request() 
 

 

 
base.request =() => { 
 
    console.log('request new implementation'); 
 
}; 
 
    
 
// now shadow the original request implementation 
 
base.request()

+0

,如果我不关心保留原来'wx.request'功能本会的工作,但在这里我需要保留它(没有访问原始代码,所以我不知道密钥和加密算法来完成请求)。 –

+0

感谢您的澄清我不清楚您无法访问原始代码。在这种情况下,我可以建议看看面向方面的编程,这可能是一些追踪代码执行时间的手段。 – GibboK

相关问题