我只能更改function a
中的代码。例如,如果我有:
Object.define(window, 'App', {get: console.log.bind(null, 'World') });
微信将获取我的代码并将其转换为:
const App = console.log.bind(null, 'Hello')
Object.defineProperty(window, 'App', {
set: ()=> {
console.error("You are not allow to modify App");
}
})
const sandbox = (App, Function, window) => {
'use strict';
function a() {
'use strict';
// *** I can only modify codes within this block ***
Object.define(window, 'App', {get: console.log.bind(null, 'World') });
// *** I can only modify codes within this block ***
}
function b() {
'use strict';
App();
}
a();
b();
};
sandbox(App, ()=>(()=>({})), undefined);
现在,我想在function a
中修改App,以便可以在function b
中更改其行为,因此它将打印World
而不是Hello
。
答案 0 :(得分:1)
您对此答案发表了评论:
让我澄清一下。我只能在
function(func)
内更改代码。其余代码由微信生成。
您无法在该函数中将声明在其中的函数的App
和Page
参数转换为吸气剂。
您似乎正在尝试用getter替换参数,也许这样您就可以观察代码何时读取它。不,您不能这样做,因为参数不是对象的属性。¹
您当然可以用getter定义一个对象,然后在函数体内使用该对象,而不是直接使用参数:
function(App, Page) {
const params = {
get App() {
// ...observe the read...
return App;
},
get Page() {
// ...observe the read...
return Page;
}
};
// Use `params.App` and `params.Page` in the body of the function.
}
...但是相当复杂。
(嗯。我刚刚意识到,在松散模式下,如果用with (params) { /*...*/ }
包裹函数主体,App
和Page
会解析为对象属性并触发getter [必须是宽松模式,因为严格模式不允许with
。]请不要这样做,除非只是作为一种调试策略。:-))
¹(至少不是您的代码可访问的一个。从概念上讲,它们是词法环境对象中的绑定,但是1.绑定不是属性(尽管它们是相似的),2.是概念上的,实际的JavaScript引擎可能对此进行了优化,并且3. JavaScript代码无法访问词法环境对象(尤其是可以对其进行优化)。:-))