为原型中的函数创建字符串名称
Creating String Names for Functions in Prototype
考虑一个数学系统,其中不同类型的数学对象具有相似的运算符;数组可以相加,复数可以相乘,等等。 但是这些运算符本身并不存在,它们必须被编写。 是否可以在原型函数定义中创建和使用字符串名称? 请考虑以下(预期的)代码:
var Interval = function(s,e) {
this.a = Math.min(s,e);
this.b = Math.max(s,e);
};
Interval.prototype["*"] = function(x,y) {
var t = x.a*y.a;
var u = x.a*y.b;
var v = x.b*y.a;
var w = x.b*y.b;
return new Interval(Math.min(t,u,v,w), Math.max(t,u,v,w));
};
Interval.prototype["*="] = function(y) {
var ret = this["*"](this, y);
this.a = ret.a;
this.b = ret.b;
};
请注意,当我执行以下操作时,我看到的特定故障会发生:
var i=new Interval(1,2);
i["*="](i);
然后Firefox抱怨第二行没有提到一个函数。
有许多这样的功能("*=","-","^",...
)。 直接按这些名称存储它们会很好,但是当我尝试上述操作时,它总是失败,告诉我诸如"......不是函数"等。 我可以放入像Interval.prototype.ops = { "*": function(x,y) {...}};
这样的缓冲区对象,但这充其量看起来不优雅。 有没有更好的方法可以做到这一点?
编辑:
此机制按预期工作。 不起作用的是尝试从构造函数中调用原型函数;例如,如果行this["*="](this);
出现在var Interval = function(s,e) { ... };
函数定义中。
如果你避免使用原型,你实际上可以这样做:
var i = function() { console.log("foo"); };
i["*"] = function() { console.log("bar"); };
然后在我的控制台中,当我询问 i 或 i["*"] 时,我得到:
> i
< function () { console.log("foo"); }
> i["*"]
< function () { console.log("bar"); }
我可以成功地打电话给他们。
不过只是提醒一下:我发现这些打字很尴尬!
您的问题与您选择的属性名称无关。当您使用括号表示法来设置或获取属性时,字符串几乎可以是任何内容......它只是一个字符串。
导致您的 ReferenceError 的原因是您尝试在 this = this["*"](this, y);
中为 this
关键字断言值。
这个问题是由于我自己对Javascript函数如何工作的理解失败。 特别是,我实际上尝试从函数构造函数中调用一个"原型化"到我的函数的函数,方式如下:
var q = function() {
...
q["blather"]();
...
};
q.prototype["blather"] = function () {
...
};
我的项目中的预期功能按预期工作;我的天真测试方法失败并产生了这个问题。
- 从字符串创建dom元素时添加多个类
- 如何使用字符串创建空的JSON键(是否嵌套)
- 从从字符串创建的函数中获取参数列表
- 如何从带有多个对象的JSON字符串创建JSON对象
- 从字符串创建 JavaScript 函数
- 从XML字符串创建DOM元素,如何使用.getElementsByName()
- 使用 eval 从字符串创建函数的不同方法
- javascript从字符串创建不区分大小写的regex
- PhantomJS从字符串创建页面
- 从任何jquery选择器字符串创建元素的最有效方法
- 是否可以使用HTML从任意字符串创建Jquery对象,例如var$newlink=$('<a>新链接
- 从 JSON 字符串创建的 knockoutjs observableArray 中的未定义(额外)对象
- 奇怪的日期()是用包含空字节的字符串创建的
- 如何使用以 js 为单位递增的字符串创建 for 循环变量
- 如何在 Java 脚本中从字符串创建对象树
- 按字符串创建对象
- jQuery 访问从字符串创建的元素
- 如何从另一个长字符串创建最多 12 个字符的加密字符串
- 从字符串创建的 Javascript 正则表达式 - 为什么它不起作用
- jquery 查询字符串创建问题