5

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

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()但如果可能的话,我宁愿保留这个模型。

4

3 回答 3

5

正如 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-10T07:01:41.530 回答
2

__proto__不是标准属性。试试这个方法:

(function(){}).constructor.prototype.to_ruby = function(){
    return 'JSFunction.new(' + this.toString().to_ruby() + ')';
};
于 2012-05-10T06:27:50.440 回答
-1

__proto__不是任何 JavaScript 标准的一部分,它只是一些浏览器制造商决定实施的伪标准。IE 是一个没有实现它的。

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

Object.prototype.foo = function () { console.log('foo'); };
(1).foo();
'asd'.foo();
(true).foo();
({ bar: 'baz' }).foo();
于 2012-05-10T06:27:26.690 回答