在Prototype中为函数创建字符串名称

时间:2014-11-15 04:43:31

标签: javascript

考虑一个数学系统,其中不同类型的数学对象具有相似的运算符;数组可以加在一起,复数可以相乘,等等。但这些运算符本身不存在,必须编写。是否可以在原型函数定义中创建和使用字符串名称?请考虑以下(预期)代码:

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) { ... };函数定义中。

3 个答案:

答案 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 () {
  ...
};

我项目中的预期功能按预期工作;我天真的测试方法失败并产生了这个问题。