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