考虑一个数学系统,其中不同类型的数学对象具有相似的运算符;数组可以加在一起,复数可以相乘,等等。但这些运算符本身不存在,必须编写。是否可以在原型函数定义中创建和使用字符串名称?请考虑以下(预期)代码:
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) {...}};
这样的缓冲对象,但这看起来似乎不够优雅。有更好的方法吗?
修改:
此机制按预期工作。什么行不通的是试图从构造函数中调用prototyped-in函数;例如,如果行this["*="](this);
出现在var Interval = function(s,e) { ... };
函数定义中。
答案 0 :(得分:1)
如果你避开原型,你实际上可以这样做:
var i = function() { console.log("foo"); };
i["*"] = function() { console.log("bar"); };
然后在我的控制台中,当我询问我或我[“*”]时,我得到了:
> i
< function () { console.log("foo"); }
> i["*"]
< function () { console.log("bar"); }
我可以成功打电话给他们。
虽然只是提醒:我发现这些非常难以打字!
答案 1 :(得分:1)
您的问题与您选择的媒体名称无关。当您使用括号表示法设置或获取属性时,字符串几乎可以是任何东西......它只是一个字符串。
导致您的ReferenceError的原因是您尝试为this
中的this = this["*"](this, y);
关键字赋值。
答案 2 :(得分:0)
这个问题源于我自己对Javascript函数如何工作的理解失败。特别是,我实际上试图调用一个&#34; prototyped-in&#34;从函数构造函数中的函数,以下列方式:
var q = function() {
...
q["blather"]();
...
};
q.prototype["blather"] = function () {
...
};
我项目中的预期功能按预期工作;我天真的测试方法失败并产生了这个问题。