通过Object.assign添加的函数的引用Object参数

时间:2018-09-11 06:05:46

标签: javascript

我正在尝试找到一种通过“ object.assign”编写可重用函数的方法。在下面的代码中,我注意到通过“ Object.assign”分配的bigsmile()函数无法访问“ name”参数。但是以某种方式,sayhi()函数在调用时可以正确获取“名称”值。 bigsime()和sayhi()有什么区别? TKS!

 
  const basicGreet = () => ({
    bigsmile: () => {
      console.log("big smile !!!");
      //console.log(name+"big smile !!!");  <-- this line cannot work
    }
  })

  const eng = (name:string) => ({
    sayhi:function(target:string){
      console.log(name + ": good morining " + target);
   }, 
  })

 let judy = (<any>Object).assign(basicGreet(), eng("Judy"));
 judy.sayhi("Jack");
 judy.bigsmile();

1 个答案:

答案 0 :(得分:0)

这是打字稿,不是js吗?还是其他预处理器?

无论如何,我猜测它的工作方式与常规js相同。您正在尝试从其他范围访问变量(查找js闭包)。 bigsmile的范围在其范围和任何包含它的范围中没有变量name。如果您想访问它,可以执行以下操作(我将其转换为Vanilla js):

  const basicGreet = () => ({
    bigsmile: function() {
      console.log("big smile !!!");
      console.log(this.name+"big smile !!!");
    },
  })

  const eng = (name) => ({
    sayhi: function(target) {
      console.log(name + ": good morining " + target); // for consistency you could use this.name
   },
   name,
  })

 let judy = Object.assign(basicGreet(), eng("Judy"));
 judy.sayhi("Jack");
 judy.bigsmile();

编辑:如果只想在对象中使用函数,则可以创建简单的getter而不是name。喜欢:

const eng = (name) => ({
  sayhi: function(target) {
      console.log(this.getName() + ": good morining " + target);
   },
   getName: function() {
      return name;
  },
})