gpt4 book ai didi

javascript - 在 ES6 中自动将参数设置为实例属性

转载 作者:行者123 更新时间:2023-12-03 02:24:45 24 4
gpt4 key购买 nike

如果您为参数添加 @ 前缀,CoffeeScript 会自动将参数设置为构造函数中的实例属性。

在 ES6 中是否有任何技巧可以实现同样的效果?

最佳答案

Felix Kling's comment概述了您将获得的最接近的整洁解决方案。它使用两个 ES6 功能 — Object.assignobject literal property value shorthand .

以下是使用 treepot 作为实例属性的示例:

class ChristmasTree {
constructor(tree, pot, tinsel, topper) {
Object.assign(this, { tree, pot });
this.decorate(tinsel, topper);
}

decorate(tinsel, topper) {
// Make it fabulous!
}
}
<小时/>

当然,这并不是您真正想要的;一方面,您仍然需要重复参数名称。我尝试编写一个可能更接近的辅助方法......

Object.autoAssign = function(fn, args) {

// Match language expressions.
const COMMENT = /\/\/.*$|\/\*[\s\S]*?\*\//mg;
const ARGUMENT = /([^\s,]+)/g;

// Extract constructor arguments.
const dfn = fn.constructor.toString().replace(COMMENT, '');
const argList = dfn.slice(dfn.indexOf('(') + 1, dfn.indexOf(')'));
const names = argList.match(ARGUMENT) || [];

const toAssign = names.reduce((assigned, name, i) => {
let val = args[i];

// Rest arguments.
if (name.indexOf('...') === 0) {
name = name.slice(3);
val = Array.from(args).slice(i);
}

if (name.indexOf('_') === 0) { assigned[name.slice(1)] = val; }

return assigned;
}, {});

if (Object.keys(toAssign).length > 0) { Object.assign(fn, toAssign); }
};

这会自动将名称以下划线前缀的任何参数分配给实例属性:

constructor(_tree, _pot, tinsel, topper) {
// Equivalent to: Object.assign({ tree: _tree, pot: _pot });
Object.autoAssign(this, arguments);
// ...
}

它支持剩余参数,但我省略了对默认参数的支持。它们的多功能性,再加上 JS 贫乏的正则表达式,使得它们很难支持超过其中的一小部分。

就我个人而言,我不会这样做。如果有一种本地方法来反射(reflect)函数的形式参数,那么这将非常容易。事实上,它是一团糟,并且在我看来并没有比 Object.assign 有显着的改进。

关于javascript - 在 ES6 中自动将参数设置为实例属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com