首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展功能原型

扩展功能原型
EN

Stack Overflow用户
提问于 2012-05-10 06:22:07
回答 3查看 10.4K关注 0票数 5

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

代码语言:javascript
复制
Number.prototype.to_ruby = function () { return this.toString(); }

它适用于我想要的其他任何东西,但不适用于函数。通过执行以下操作,我可以让它在铬中工作:

代码语言:javascript
复制
_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(),但如果可能的话,我宁愿保留这个模型。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-10 06:27:50

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

代码语言:javascript
复制
(function(){}).constructor.prototype.to_ruby = function(){
    return 'JSFunction.new(' + this.toString().to_ruby() + ')';
};
票数 2
EN

Stack Overflow用户

发布于 2012-05-10 07:01:41

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

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

代码语言:javascript
复制
Function.prototype.to_ruby = function() {
  return this.toString();
}

但是,有一条一般规则是不应该修改内置对象的,这主要是因为您永远不知道什么时候它会回来困扰您(例如,新版本的ECMAScript实现了同名的属性)。也许您最好编写一个toRuby函数:

代码语言:javascript
复制
function toRuby(obj) {
  return obj.toString();
}

但是,还可以使用+运算符将字符串连接起来以隐式调用toString方法:

代码语言:javascript
复制
'' + obj; // returns obj.toString()

它将返回与上述两个结果完全相同的结果。你自己选吧。

票数 5
EN

Stack Overflow用户

发布于 2012-05-10 06:27:26

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

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

代码语言:javascript
复制
Object.prototype.foo = function () { console.log('foo'); };
(1).foo();
'asd'.foo();
(true).foo();
({ bar: 'baz' }).foo();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10528495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档