Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为原型中的函数创建字符串名称_Javascript - Fatal编程技术网

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

Javascript 为原型中的函数创建字符串名称,javascript,Javascript,考虑一个数学系统,其中不同类型的数学对象具有相似的运算符;数组可以相加,复数可以相乘,等等。但这些运算符本机不存在,它们必须写入。是否可以在原型函数定义中创建和使用字符串名称?考虑下面的(预期的)代码: 请注意,我看到的特定故障发生在我执行以下操作时: var i=new Interval(1,2); i["*="](i); 然后firefox抱怨第二行不是指函数 有许多这样的函数(“*=”、“-”、“^”、…)。直接用这些名称存储它们会很好,但是当我尝试上面的方法时,它总是失败,告诉我诸如“

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

请注意,我看到的特定故障发生在我执行以下操作时:

var i=new Interval(1,2);
i["*="](i);
然后firefox抱怨第二行不是指函数

有许多这样的函数(
“*=”、“-”、“^”、…
)。直接用这些名称存储它们会很好,但是当我尝试上面的方法时,它总是失败,告诉我诸如“…不是函数”之类的事情。我可以放入一个缓冲区对象,比如
Interval.prototype.ops={“*”:function(x,y){…},但这充其量也不雅观。有更好的方法吗

编辑


该机制按预期工作。不起作用的是试图从构造函数中调用原型函数;例如,如果行
this[“*=”](this)出现在
var区间=函数(s,e){…}中函数定义。

如果您避开原型,实际上可以这样做:

var i = function() { console.log("foo"); };
i["*"] = function() { console.log("bar"); };
然后在我的控制台中,当我问起我或我[“*”]时,我得到:

>i
i[“*”]
我可以成功地给他们打电话


只是提醒一下:我发现这些打字很难

您的问题与您选择的属性名称无关。当您使用括号表示法设置或获取属性时,字符串实际上可以是任何内容。。。这只是一根绳子


导致引用错误的原因是,您试图在
this=this[“*”](this,y)中为
this
关键字赋值

这个问题源于我自己对Javascript函数如何工作的理解失败。特别是,我实际上尝试从函数构造函数中调用一个“原型化”的函数,方法如下:

var q = function() {
  ...
  q["blather"]();
  ...
};

q.prototype["blather"] = function () {
  ...
};

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

这是一个好的选择;手动将这些函数添加到每个对象将是构造函数中的一个过程。。。请注意,我不打算键入这些操作(大部分时间),而是通过一系列其他函数调用传递它们,这样我就不一定知道在给定点调用的是哪个操作……为什么要避免原型?@Bergi:因此我的问题;我正试图准确地执行问题中的代码(现在写得正确),发现对象不允许访问我创建的函数。@abiessu:唯一的问题是代码写得不正确。但是,我不认为有理由避免使用原型,因此我向Blake提出了问题;这是第一个失败的例子,我确实想工作,第二个只是另一个建议的用法。问题似乎是(至少在Firefox中)括号符号不是
原型
特殊对象属性的正确访问器;点符号适用于我所有的代码。@abiessu如果没有完整的示例来重现问题,我无法调试任何东西…对不起。。。我认为只需添加
var I=新区间(1,2);i[“*=”](i)
是让Firefox在控制台中抱怨的最简单的方法…@abiessu,在回答您的问题时发布;构造函数甚至不会运行,因为min和max不是1和2的函数。因此,甚至没有创建间隔。你的代码永远不会到达
i['*=']..
i get min不是一个函数,因为我不知道传递给区间构造函数的是什么类型的s和e。您的代码也没有显示min和max返回的类型。如果创建实例,代码应该可以工作:
var one=new Interval(?,);。。。一['*='](二)
问题似乎不在于原型函数,而在于原型函数传递的参数或返回的最小值和最大值。@hmr:true,我的示例比我包含的代码更抽象。更正…这对我来说很有效。请显示在出现“…不是函数”错误时尝试的确切代码。。执行正确发布的代码会将
i
作为
间隔{a:1,b:4}
。还有其他代码吗?确切的错误信息是什么?@Bergi好的,这比我之前得到的要好。下次我会用电脑而不是手机问一个恰当的问题。
> i
< function () { console.log("foo"); }
> i["*"]
< function () { console.log("bar"); }
var q = function() {
  ...
  q["blather"]();
  ...
};

q.prototype["blather"] = function () {
  ...
};