我试图从命令行解决这个问题:是否有一种优雅的方法来使用构造函数来创建带有通过提供给第一个构造函数的参数命名的构造函数? 让我们说我们想要一个动物分组的构造函数。分组构造函数接受参数,该参数命名新构造函数将采用的任何参数。新构造函数以变量赋值命名。然后在新构造函数中,我们可以将这些参数设置为对象的属性(以前使用我们的变量赋值命名)。我希望这个功能看起来像这样:
var herd = new grouping("species", "color", "cattle");
var school = new grouping("species", "color", "dolphins");
console.log(new herd(20, "Angus", "black"));
herd({
cattle: 20,
species: "Angus",
color: "black"
})
console.log(new school(2, "Bottlenose", "grey"))
school({
dolphins: 2,
species: "Bottlenose",
color: "grey"
})
我在"构造函数构造函数","动态函数名称赋值"以及"动态javascript构造函数"上进行的搜索,似乎我这是不可避免的凌乱。如果是这样,这会使这个实例忘记DRY吗?
答案 0 :(得分:0)
这可以做你想要的。请注意,由于我们不需要"实例,因此您不必使用new
进行此调用。这些功能:
function grouping(...keys) {
return function (...values) {
return keys.reduce((obj, key, i) => (obj[key] = values[i], obj), {});
}
}
var herd = grouping("species", "color", "cattle");
console.log(herd(20, "Angus", "black"));

但是如果你这样做而不是直接使用对象文字,只是不重复键名,重新考虑你的决定。如果不查看创建herd
或school
的调用,您就不知道要传递的参数的顺序。
看来简单地使用对象文字会更易于维护:
var obj = {
cattle: 20,
species: "Angus",
color: "black"
};
如果你真的想要一个构造函数生成器(只有在你使用原型时才有意义),那么你可以这样做:
function grouping(...keys) {
return function (...values) {
keys.forEach((key, i) => this[key] = values[i]);
}
}
var Herd = grouping("species", "color", "cattle");
console.log(new Herd(20, "Angus", "black"));