通過與源代碼串的工作改變功能可以說是相當簡單的。要爲特定實例執行此操作,請嘗試:
eval(doSomething.toString().replace(/}\s*$/, ' return id; $&');
現在doSomething
返回ID。我通常不是eval
的粉絲,但由於需要訪問本地變量,因此在這裏不適用aspect oriented programming技術。
如果doSomething
已經返回一個值,嘗試:
eval(doSomething.toString().replace(/}\s*$/, ' window.someID = id; $&');
把它變成一個功能,我們需要在全球範圍內的代碼評估:
function insertCode(func, replacer, pattern) {
var newFunc = func.toString().replace(pattern, replacer);
with (window) {
eval(newFunc);
}
}
function after(func, code) {
return insertCode(func, function (old) { code + old }, /}\s*$/);
}
...
after(doSomething, 'return id;');
如果你想重寫方法和匿名函數綁定到變量,將insertCodeBefore
更改爲:
function insertCode(funcName, replacer, pattern) {
var newFunc = eval('window.' + funcName).toString().replace(pattern, replacer);
eval('window.' + funcName + '=' + newFunc);
}
...
function Foo() {}
Foo.prototype.bar = function() { var secret=0x09F91102; }
...
after('doSomething', 'return id;');
after('Foo.prototype.bar', 'return secret;');
注意函數的第一個參數現在是字符串。我們可以定義其他功能:
function before(func, code) {
return insertCode(func, function (old) {old + code}, /^function\s+\w+\([^)]*\)\s+{/);
}
function around(func, beforeCode, afterCode) {
before(func, beforeCode);
after(func, afterCode);
}
功能是如何「鎖定」的? – Lazarus 2010-01-21 12:22:53
[有沒有辦法用函數包裝所有JavaScript方法?](http://stackoverflow.com/questions/3919134/is-there-a-way-to-wrap-all-javascript-methods-函數) – 2016-07-14 04:47:34