JavaScript中动态定义的函数名
Dynamically defined Function Names In JavaScript?
这就是我正在努力实现的目标。这是一段现有的代码-
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");
是的,结合jfriend的解决方案效果很好:
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]);
}
}
相关文章:
- 用嵌套函数和默认函数定义函数
- 使用Extjs进行函数定义
- JS中奇怪的函数定义语法
- 重写javascript函数定义
- 使用角度图时,我可以用函数定义数据点颜色吗
- modal.js中的匿名函数定义
- 为从AJAX调用中utlizes DATA参数的函数定义回调
- Emacs:在 etag 中查找函数定义
- Javascript:对象函数定义
- 为什么要在函数定义之外引用静态变量(函数属性)
- Ember 对象函数定义中的计算属性.js
- javascript/jQuery中函数定义的区别
- CoffeeScript 承诺与函数定义链接
- 如何在使用 eval() 评估 JavaScript 时将回调函数定义作为参数传递
- Javascript - 为什么下面的函数定义错误
- 使用函数声明时的自定义函数(也称为惰性函数定义)
- JavaScript 函数定义不正确
- jQuery off on 时是用匿名函数定义的
- 停止 IntelliJ 11 在启用 JSLint 时向每个嵌套函数定义添加“use strict”
- 为什么不是't我为这个函数定义的javascript函数