我希望能够在javascript中扩展函数原型(也就是说,向所有函数添加一个函数)。其目的是将其转换为另一种语言之间的交换格式(即ruby,它只能通过特定设置中的字符串进行通信)。我已经有了一个系统,所以我可以通过在ruby对象上定义to_js方法和在javascript对象上定义to_ruby方法来传递其他类型,如下所示
Number.prototype.to_ruby = function () { return this.toString(); }它适用于我想要的其他任何东西,但不适用于函数。通过执行以下操作,我可以让它在铬中工作:
_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(),但如果可能的话,我宁愿保留这个模型。
发布于 2012-05-10 06:27:50
__proto__不是标准属性。试试这种方法:
(function(){}).constructor.prototype.to_ruby = function(){
return 'JSFunction.new(' + this.toString().to_ruby() + ')';
};发布于 2012-05-10 07:01:41
正如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()它将返回与上述两个结果完全相同的结果。你自己选吧。
发布于 2012-05-10 06:27:26
__proto__不是任何JavaScript标准的一部分,它只是一些浏览器制造商决定实施的一个令人费解的标准。IE是一个还没有实现它的公司。
如果要修改JavaScript类型系统中的任何类型,则必须修改Object原型:
Object.prototype.foo = function () { console.log('foo'); };
(1).foo();
'asd'.foo();
(true).foo();
({ bar: 'baz' }).foo();https://stackoverflow.com/questions/10528495
复制相似问题