为原型中的函数创建字符串名称

Creating String Names for Functions in Prototype

本文关键字:字符串 创建 函数 原型      更新时间:2023-09-26

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

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 () {
  ...
};
我的

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