【问题标题】:How to set an object function equal to another [duplicate]如何将对象函数设置为等于另一个[重复]
【发布时间】:2018-11-29 08:58:28
【问题描述】:

假设我有以下对象:

let obj={
    childone: (value) => {
        return value+1;
    },
    childtwo: (value) => {
        return value+3;
    },
    childsingle: (value) => {
        return value+1;
    }
};

有没有什么方法可以在同一个声明中设置obj.childsingle 等于obj.childone

我正在尝试在对象声明中实现childsingle=childone

我还尝试按照重复的建议答案使用get

但是,使用这个之后:

let obj = {
    childone: (value) => {
        return value+1;
    },
    childtwo: (value) => {
        return value+3;
    },
    get childsingle() {
        return this.childone;
    }
};

我收到handleError TypeError: childsingle is not a function

【问题讨论】:

  • 您可以在对象声明之前将函数定义为 const 并将相同的函数传递给它们
  • 在对象文字内 - 否。
  • 是的@WiktorZychla 但我不能使用 this 因为它与类有关。
  • 不要使用箭头函数childsingle: function(value) {return this.childone(value)}

标签: javascript typescript ecmascript-6


【解决方案1】:

您可以使用getter 方法进行childsingle 声明。示例如下所示。

当您调用childsingle 时,它始终会返回childone,即使您更新childone childone 将始终指向最新的childone

更多信息请参考Defining getters and setters Section

let obj = {
    childone: (value) => {
        return value+1;
    },
    childtwo: (value) => {
        return value+3;
    },
    get childsingle() {
        return this.childone;
    }
};

console.log(obj.childsingle(10));

【讨论】:

【解决方案2】:

避免的原因是什么:

let obj = {
    childone: (value) => {
        return value + 1;
    },
    childtwo: (value) => {
        return value + 3;
    },
    childsingle: (value) => {
        return obj.childone(value);
    }
};

它提供:

console.log(obj.childone(1)); // 2
console.log(obj.childsingle(2)); // 3

词法作用域在更高级的场景中也保持诚实:

function getObj() {
    const obj = {
        childone: (value) => {
            return value + 1;
        },
        childtwo: (value) => {
            return value + 3;
        },
        childsingle: (value) => {
            return obj.childone(value);
        }
    };

    return obj;
}

const example = getObj();

console.log(example.childone(1));
console.log(example.childsingle(2));

【讨论】:

  • @Fentom +1 进行解释,但我试图只设置一个对象 fn 等于另一个对象,而不是在每次需要时设置一个新对象。
  • @Vixed 上面的例子就是这样做的——这个函数只是为了显示如果你传递对象的话,词法作用域会被保留。
【解决方案3】:

你可能会想到这样的事情:

let obj={
    childone: (value) => {
        return value+1;
    },
    childtwo: (value) => {
        return value+3;
    },
    childsingle: obj.childone
    }
};

但这不起作用。您必须分两步完成。

赋值运算符(=)的工作方式如下。它使用运算符的右侧,计算其值并将该值(在您的情况下是对对象的引用)分配给左侧的变量。

因此,在组装赋值运算符的右侧时,obj 变量不存在。所以你会得到一个错误。

这也行不通

let obj={
    childone: (value) => {
        return value+1;
    },
    childtwo: (value) => {
        return value+3;
    },
    childsingle: this.childone
    }
};

因为this 不会引用当前对象。

这不起作用,因为childone 没有定义

let obj={
    childone: (value) => {
        return value+1;
    },
    childtwo: (value) => {
        return value+3;
    },
    childsingle: childone
    }
};

这是要走的路:

let obj={
    childone: (value) => {
        return value+1;
    },
    childtwo: (value) => {
        return value+3;
    },
};
obj.childsingle = obj.childone;

但请注意,如果您计划更改 childone 函数并认为 childsingle 函数也会更改,那是不正确的。

在更改childone 之前,我们有两个对象键(childone 和childsingle)是对同一函数的引用。但是 childone 和 childsingle 不相关。如果您更改 chilone,这将是对新函数的引用,而 childsingle 将保持相同的旧函数

【讨论】:

  • let obj={ childone: (value) => { return value+1; }, childtwo: (value) => { return value+3; }, childsingle: (value) => { return obj.childone(value) } }; 也可以
  • @mplungjan 我认为这是对 OP 的评论。这不适用于 OP 状态
  • 我不明白为什么它不如 obj.childsingle = obj.childone 有效 - 有额外的机会检测调用了哪个而不重复处理
  • 有效的。它仍然不适用于 OP
猜你喜欢
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2010-12-29
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多