Javascript对象方法:调用属性内的另一个方法(此关键字)

时间:2019-07-06 23:25:55

标签: javascript oop object methods this

我创建了一个示例结构,以便更好地了解方法的行为。

关键字是指方法的对象。像这样;

const obj1 = {
    x(param1, param2) {return param1 * param2},
    y(param1, param2, param3) {return param1 * param2 * param3},
    z () {
        console.log(this) 
        console.log(this.x(10,20))
        console.log(obj1.x(10,20))
        return 'done'
        /* 
            { x: [Function: x], y: [Function: y], z: [Function: z] }
            200
            200 
        */
    }
}

如果我需要使用这种结构怎么办?

const obj2 = {
    a: {
        x(param1, param2) {return param1 * param2},
        y(param1, param2, param3) {return param1 * param2 * param3},
    },

    b: {
        p: 5,
        z()  {
            console.log(this)
            console.log(this.x(10,20)) // Fails because there is not a method which is called x inside **this**
            console.log(obj2.a.x(10,20))
            return 'done'
            /* 
              { x: [Function: x], y: [Function: y], z: [Function: z] }
              TypeError
              200 
            */
        }
    }
}

在属性内调用另一个方法的唯一方法是这个吗? obj2.a.x(10,20)

还有其他方法吗?关于这个主题有什么最佳实践吗?


也许这应该是另一个问题,但这是超级相关的,所以...

如果我想使用这种箭头功能怎么办?

const obj3 = {
    x: (param1, param2) => param1 * param2,
    y(param1, param2, param3) {return param1 * param2 * param3},
    z: () => {
        console.log(this) 
        console.log(obj3.x(10,20))
        return 'done'
        /* 
            { }
            TypeError
            200 
        */
    } 
}

在这种情况下,当我使用 this 时,它将返回空对象。同样,我应该使用 obj3.x(10,20)来调用x方法吗?

在我看来,在对象内部写最外层的对象名称似乎并不那么酷,但是找不到其他解决方案。等待您的意见!

1 个答案:

答案 0 :(得分:-1)

您可以使用closures

function closureObj() {
  let self = this;
  self.x = (param1, param2) => { return param1 * param2};
  self.z = () => {
    console.log(self);
    console.log(self.x(10,20));
    return 'done';
    /* 
        { }
        TypeError
        200 
    */
  };
  //public methods
  return {
    publicMethod : self.z
  }
}


let closure1 = new closureObj();
closure1.publicMethod();