2017-08-28 54 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

相關問題