如何将一个对象函数设置为另一个对象函数

5
假设我有以下对象:
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,并将相同的函数传递给它们两个。 - Gilad Bar
在对象字面量中 - 不可以。 - hindmost
是的@WiktorZychla,但我不能使用this,因为它与类相关。 - Vixed
@mplungjan 没有任何意义...我的意思是我不想重写一个函数。 - Vixed
2
请勿使用箭头函数childsingle: function(value) {return this.childone(value)} - GuySake
显示剩余3条评论
3个回答

4
您可以使用getter方法来声明childsingle。以下是示例:
在此示例中,当您调用childsingle时,它将始终返回childone,即使您更新了childonechildone也将始终指向最新的childone
有关更多信息,请参见定义getter和setter部分

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

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


1
不错,但是我在控制台中遇到了一个错误... handleError TypeError: childsingle 不是一个函数 - Vixed
@Vixed 你正在使用 Internet Explorer 吗?在这里检查浏览器兼容性:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/get#Browser_compatibility - Karan
不要卡拉姆...谷歌浏览器... - Vixed

3
避免的原因是什么:
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 感谢您的解释,但我想要的是将一个对象函数仅设置为另一个对象函数,而不是每次需要时都创建一个新对象。 - Vixed
@Vixed,顶部的示例就是这样做的 - 函数只是为了展示如果你传递对象,词法作用域会被保留。 - Fenton

2
你可能会想到这样的东西:
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在其他方面没有关联。如果您更改childone,这将是对新函数的引用,而childsingle将保持旧函数不变。


让obj等于{childone:(value)=> {return value + 1; },childtwo:(value)=> {return value + 3; },childsingle:(value)=> {return obj.childone(value)}};也可以工作。 - mplungjan
@mplungjan,我在原帖的评论中看到了这个。但是这并不适用于原帖中所述。 - yunzen
我不明白为什么这不如obj.childsingle = obj.childone有效 - 而且还有额外的机会检测到调用了哪一个,而不需重复处理。 - mplungjan
它是有效的。但仍不适用于 OP。 - yunzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接