javascript - 在 JavaScript 中动态定义函数名称?

标签 javascript function

这就是我要实现的目标。这是一段现有的代码 -

function PartMetaData(dataElement) {
this.metaData = new MetaData(dataElement);

this.getDescription = function () {
    return this.metaData.getElement("data-part-description");
};

this.getLength = function () {
    return this.metaData.getElement("data-part-length");
};

this.getWidth = function () {
    return this.metaData.getElement("data-part-width");
};

this.getHeight = function () {
    return this.metaData.getElement("data-part-height");
};

this.getWeight = function () {
    return this.metaData.getElement("data-part-weight");
};
}

现在看看函数名和属性名之间的关系——这看起来很像可以避免的重复代码。那是可以实现的吗?有没有办法允许对对象进行“任何”函数调用并根据函数名称确定要做什么?

例如类似的东西(语法是编造的,我不知道 Javascript 或任何其他语言中是否存在类似的东西)

function PartMetaData(dataElement){
this.metaData = new MetaData(dataElement);

this.get(name?) = function () {
    return this.metaData.getElement("data-part-" + name.toLower());
}

这样调用者仍然可以调用

partMetaData.getDescription();

有什么想法吗?我知道我可以更改签名并使其成为一个功能,我只是想知道是否可以使用一些 JS(黑色?)魔法保持签名不变。谢谢!

最佳答案

您可以制作一个辅助函数,您可以像这样使用它来创建所有这些方法。

function PartMetaData(dataElement) {
    this.metaData = new MetaData(dataElement);

    function makeAccessor(o, itemName) {
        var ucase = itemName.substr(0,1).toUpperCase() + itemName.substr(1);
        o["get" + ucase] = function() {
            return this.metaData.getElement("data-part-" + itemName);
        }
    }

    var items = ["description", "weight", "height", "width", "length"];
    for (var i = 0; i < items.length; i++) {
        makeAccessor(this, items[i]);
    }
}

使用稍微不同的界面来执行此操作的更简单方法是:

function PartMetaData(dataElement) {
    this.metaData = new MetaData(dataElement);
    this.getProperty = function(name) {
        return this.metaData.getElement("data-part-" + name);
    }
}

并且,您可以像这样使用它:

partMetaData.getProperty("height");

关于javascript - 在 JavaScript 中动态定义函数名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9511241/

相关文章:

javascript - IntelliJ - 打开光标下文件的键盘快捷方式

javascript 重定向表单适用于 Chrome/Safari,但不适用于 Firefox/IE

javascript - jasmine 如何定义其 toEquals

java - 查找整数数组中的最大数字

c - 将函数作为参数传递

php - Ajax 链接选择框不刷新

javascript - 图表的宽度影响我在 Highcharts 中的第二个 x 轴标签

c++ - 作为函数参数的大小数组的目的是 C 和 C++?

python - 在模块级别或功能级别导入?

PHP 定义一个变量,如果它没有传递给函数