JavaScript中动态定义的函数名称?

时间:2012-03-01 05:48:03

标签: 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");
};
}

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

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

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

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

这样调用者仍然可以调用

partMetaData.getDescription();

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

2 个答案:

答案 0 :(得分:3)

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

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");

答案 1 :(得分:0)

是的,结合j朋友的解决方案效果很好:

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

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

    this.makeAccessor = function(name) {
       this["get" + name.substr(0,1).toUpperCase() + name.substr(1)] =
          function() { return this.getProperty(name); }
    }

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