我只能更改function a
中的代码。例如,如果我有:
Object.defineProperty(window, 'App', { get: console.log.bind(null, 'World') });
微信将获取我的代码并将其转换为:
__wxJSEngine.App = console.log.bind(null, 'Hello')
g.App = __wxJSEngine.App
Object.defineProperty(g, 'App', {
set: ()=> {
console.error("You are not allow to modify App");
}
})
((App, Function, window) => {
'use strict';
function a() {
'use strict';
// *** I can only modify codes within this block ***
Object.defineProperty(window, 'App', { get: console.log.bind(null, 'World') });
// *** I can only modify codes within this block ***
}
function b() {
'use strict';
App();
}
a();
b();
})(g.App, ()=>(()=>({})), undefined);
现在,我想在function a
中修改App,以便可以在function b
中更改其行为,因此它将打印World
而不是Hello
。
答案 0 :(得分:0)
鉴于代码的结构,函数b
将不会使用全局App
,而是直接使用sandbox
的参数。
a
的范围可以访问此参数,并且不声明为 const 。
因此,您要做的就是从App
内部覆盖变量a
的值,以便b
可以使用您自己的值。
window.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 ***
App = console.log.bind(null, 'World');
// *** I can only modify codes within this block ***
}
function b() {
'use strict';
App();
}
a();
b();
};
sandbox(window.App, ()=>(()=>({})), undefined);
现在,这不会更改window.App
的值,但是由于此属性已被定义为不可写,不可配置,因此您无法将其设置为其他值。
答案 1 :(得分:-1)
对象组成是将属性从一个对象复制到另一个对象时的情况。 Object.assign()
是goto方法。
const App = func => ({
salutation: () => {
return `${func.user}: ${func.HW}`;
}
});
const a = (user, greeting) => {
let func = {
user,
HW: greeting
};
return Object.assign(func, App(func));
};
const A = a('zer00ne', 'World');
console.log(A.user);
console.log(A.salutation());