代码之家  ›  专栏  ›  技术社区  ›  user1790300

从另一个不起作用的方法调用对象方法

  •  0
  • user1790300  · 技术社区  · 3 年前

    假设我有以下编码场景:

    export const test = () => {
        return (
            var1,
            var2,
            var3
        ) => {
            return Object.freeze({
                getVarOne: () => var1,
                getVarTwo: () => var2,
                getVarThree: () => var3,
                total: () => var1 + var2 + var3,
                squareTotal: () => Math.pow(total(), 2)
            })
        }
    }
    
    let obj1 = test();
    let obj2 = obj1(1, 2, 3);
    let obj3 = obj2.squareTotal();
    

    我可以通过什么方法从squareTotal方法访问total方法?总的方法调用我一直没有定义。

    2 回复  |  直到 3 年前
        1
  •  1
  •   trincot Jakube    3 年前

    存在未定义的 total 作为参数调用的函数 Math.pow 。如果您打算拨打 成员 的,则需要指定它是 变量 引用,而不是 所有物 .

    您可以使用 this ,但必须将该方法作为标准 function 可以使用ES6对象方法表示法(省略 作用 关键字):

    const test = () => {
        return (
            var1,
            var2,
            var3
        ) => {
            return Object.freeze({
                getVarOne: () => var1,
                getVarTwo: () => var2,
                getVarThree: () => var3,
                total: () => var1 + var2 + var3,
                squareTotal() { return Math.pow(this.total(), 2) }   
            })
        }
    }
    
    let obj1 = test();
    let obj2 = obj1(1, 2, 3);
    let obj3 = obj2.squareTotal();
    
    console.log(obj3);  
        2
  •  0
  •   jfriend00    3 年前

    从的内部 squareTotal() 当调用时,如您在示例中所示,您可以执行以下操作:

    this.total()
    

    this obj2 哪个是具有 total 方法。但是,对于任何希望引用自己对象的方法,您也需要停止使用箭头函数,因为箭头函数使用的词法值为 ,而不是的调用对象值 .

    这将适用于以下两个更改1)更改为 this.total() 和2)变化 平方总和() 到正则函数-而不是箭头函数,因此它具有适当的值 :

    const test = () => {
        return (
            var1,
            var2,
            var3
        ) => {
            return Object.freeze({
                getVarOne: () => var1,
                getVarTwo: () => var2,
                getVarThree: () => var3,
                total: () => var1 + var2 + var3,
                squareTotal: function() {
                    return Math.pow(this.total(), 2);
                },
            })
        }
    }
    
    let fn = test();
    let obj2 = fn(1, 2, 3);
    let result = obj2.squareTotal();
    console.log(result);
        3
  •  0
  •   Tushar Shahi    3 年前

    total 不是可以调用的全局函数 total() 。如果您想访问 全部的 的方法 object 你回来了,打电话 this.total() 。但请确保不要使用箭头函数表达式。

    您可以使用以下代码:

    const test = () => {
        return (
            var1,
            var2,
            var3
        ) => {
            return Object.freeze({
                getVarOne: () => var1,
                getVarTwo: () => var2,
                getVarThree: () => var3,
                total: () => var1 + var2 + var3,
                squareTotal: function() {return Math.pow(this.total(), 2) }
            })
        }
    }    
    
    let obj1 = test();
    let obj2 = obj1(1, 2, 3);
    let obj3 = obj2.squareTotal();
    
    console.log(obj3);

    从箭头函数更改的原因是,箭头函数采用 this 从他们声明的词汇范围来看。在这里,它将属于 window object 对于任何其它方法, 取决于它们是如何被调用的(这里它们是由对象调用的)。 Relevant SO answer

        4
  •  0
  •   KooiInc    3 年前

    如果您想访问同一对象内的属性,请不要使用箭头函数:它们不能使用对象的 scope 。这是工厂函数的简化,其中 total getter squareTotal 实例的函数表达式。

    const test = () => {
      return (var1, var2, var3) => {
        return Object.freeze({
          get total() {
            return var1 + var2 + var3;
            // ^ because the object is frozen
            //   var1 ... var3 don't have to be
            //   part of the object. Values are
            //   retrieved from closed over 
            //   parameter values
          },
          squareTotal() {
            return Math.pow(this.total, 2);
          },
        });
      };
    }
    
    const obj1 = test();
    const obj2 = obj1(1, 2, 3);
    console.log(`obj2.squareTotal(): ${obj2.squareTotal()}`);
    
    // btw: because of the closure, the factory can 
    // be simplified to a one liner too:
    const test1a = () => (v1, v2, v3) => Object.freeze({
        squareTotal: () => Math.pow(v1 + v2 + v3, 2), });
    const obj1a = test1a()(1, 2, 3);
    console.log(`obj1a.squareTotal(): ${obj1a.squareTotal()}`);
    
    // note: getter is not useful in a frozen object,
    // but if the properties may change later it can be
    // because in that case 'total' always gives the current
    // total
    
    const test2 = () => {
      return (var1, var2) => {
        return {
          var1,
          var2,
          get total() {
            return this.var1 + this.var2;
          },
          squareTotal() {
            return Math.pow(this.total, 2);
          },
        };
      };
    };
    const x = test2()(1, 2);
    console.log(`x.sqareTotal(): ${x.squareTotal()}`);
    x.var2 = 15;
    console.log(`x.var2: ${x.var2}; x.squareTotal():  ${x.squareTotal()}`);