Javascript 扩展功能原型

Javascript 扩展功能原型,javascript,prototype,Javascript,Prototype,我希望能够用javascript扩展函数原型(也就是说,在所有函数中添加一个函数)。 其目的是将其转换为另一种语言(即ruby,它只能通过字符串[在此特定设置中]进行通信)之间交换的格式。我已经有了一个系统,所以我可以通过在ruby对象上定义to_js方法和在javascript对象上定义to_ruby方法来传递其他类型,就像这样 Number.prototype.to_ruby = function () { return this.toString(); } 这是工作的一切,我想它,但不是

我希望能够用javascript扩展函数原型(也就是说,在所有函数中添加一个函数)。 其目的是将其转换为另一种语言(即ruby,它只能通过字符串[在此特定设置中]进行通信)之间交换的格式。我已经有了一个系统,所以我可以通过在ruby对象上定义
to_js
方法和在javascript对象上定义
to_ruby
方法来传递其他类型,就像这样

Number.prototype.to_ruby = function () { return this.toString(); }
这是工作的一切,我想它,但不是功能。我可以通过以下操作使其在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()
,但如果可能的话,我宁愿保留这个模型。

这个
\uuuu proto\uuuu
不是任何JavaScript标准的一部分,它只是一些浏览器制造商决定实施的一个pesudo标准。IE是一个尚未实施的标准

如果要修改JavaScript类型系统中的任何类型,则必须修改
对象
原型:

Object.prototype.foo = function () { console.log('foo'); };
(1).foo();
'asd'.foo();
(true).foo();
({ bar: 'baz' }).foo();

\uuuu proto\uuu
不是标准属性。请尝试以下方法:

(function(){}).constructor.prototype.to_ruby = function(){
    return 'JSFunction.new(' + this.toString().to_ruby() + ')';
};

正如Slace所说,您可以通过将该方法添加到
Object.prototype
,将其添加到所有对象中,但这并不是真正的洁净,因为它可能会严重影响为..in循环编写的方法

您可以通过
函数将其添加到函数中。prototype

Function.prototype.to_ruby = function() {
  return this.toString();
}
但是,有一条一般规则,您不应该修改内置对象,主要是因为您永远不知道它何时会回来困扰您(例如,新版本的ECMAScript实现了同名属性)。也许您最好编写一个
toRuby
函数:

function toRuby(obj) {
  return obj.toString();
}
但您也可以使用
+
运算符与字符串连接,隐式调用
toString
方法:

'' + obj; // returns obj.toString()

这将返回与上述两个完全相同的结果。您的选择。

啊!添加
.constructor
给了我我想要的功能-谢谢!您必须按角色付费。
(function(){})。constructor.prototype
就是
function.prototype
。并调用
someObj.to_ruby()
将与
“+someObj
@RobG,你是对的-当然,现在我看到了,这是非常有意义的。谢谢:)@RobG,不要明白了:
”+someObj
,with
someObj={a:1,b:2}
向我返回
“[对象对象]”
。和
({a:1,b:2})。原型
解析为undefined@Eineki-是的,应该使用
someFn
,因为OP是关于函数的,但是你可以用更合适的方法替换
Object.prototype.toString
(但是要小心分享这些代码)。我理解你的论点,但我有很多不同类型的对象,它们的返回方式都略有不同。因此,这适用于数字和字符串等基本类型(假设它们不需要转义),但对于数组、散列类对象和自定义类型,我必须为每种类型编写一个特例,并继续编辑,因为我需要更多或更少的对象。在这种情况下,您可以编写一个
toRuby()
函数并告诉它如何转换传递的对象,例如
toRuby(someFn,'fn')
toRuby(someObj,'obj')
或类似的。这是我最初拥有的,但随着可能的对象类型数量的增加,我认为在支持转换的对象上使用to_ruby方法会更容易。这样我就可以轻松地测试支持以及执行转换。哈!我只是碰巧在调查同样的事情。SketchUp Ruby JavaScript桥:D