我希望能够扩展javascript中的函数原型(也就是说,向所有函数添加一个函数)。
目的是将其转换为一种格式,以便在另一种语言(即 ruby,它只能通过字符串进行通信[在这种特定设置中])之间进行交换。我已经有了一个系统,因此我可以通过定义一个来传递其他类型to_js
ruby 对象上的方法和to_ruby
javascript 对象上的方法,就像这样
Number.prototype.to_ruby = function () { return this.toString(); }
这适用于我想要的其他一切,但不适用于功能。我can通过执行以下操作使其在 Chrome 中工作:
_empty = function() {};
_empty.__proto__.to_ruby = function () {
return 'JSFunction.new(' + this.toString().to_ruby() + ')';
};
但这在IE中不起作用(这是系统的要求)。
我知道我有一个对象通过 ID 或类似的方式跟踪函数,但我不能保证它们将与创建它们的同一实例一起使用。
其他一切都失败了,我可以编写一个函数来处理特殊情况(即,isFunction(instance) ? fn_to_ruby(instance) : instance.to_ruby()
,但如果可能的话我宁愿保留这个模型。
正如 Slace 所说,您可以通过将方法添加到Object.prototype
,但这并不是真正的犹太洁食,因为它可能会影响写得不好的 for..in 循环。
您可以通过以下方式将其添加到函数中Function.prototype
:
Function.prototype.to_ruby = function() {
return this.toString();
}
然而,有一条一般规则是您不应该修改内置对象,主要是因为您永远不知道它什么时候会回来困扰您(例如,新版本的 ECMAScript 实现了同名的属性)。也许你最好写一个toRuby
功能:
function toRuby(obj) {
return obj.toString();
}
但你也可以使用+
运算符与字符串连接以调用toString
隐式方法:
'' + obj; // returns obj.toString()
这将返回与上述完全相同的结果。你的选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)