在父函数中修改其设置器后,是否可以重新定义函数?

时间:2019-04-01 09:49:58

标签: javascript

我只能更改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

2 个答案:

答案 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());