首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用任意原型制作可调用的JS对象?

如何使用任意原型制作可调用的JS对象?
EN

Stack Overflow用户
提问于 2009-02-14 04:34:34
回答 4查看 10.8K关注 0票数 15

可能重复:

Can a JavaScript object have a prototype chain, but also be a function?

我希望创建一个具有任意原型链的可调用JavaScript对象,但不需要修改Function.prototype。

换言之,必须这样做:

代码语言:javascript
复制
var o = { x: 5 };
var foo = bar(o);
assert(foo() === "Hello World!");
delete foo.x;
assert(foo.x === 5);

而不做任何全球性的改变。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-14 06:04:18

没有什么可以阻止您向函数添加任意属性,例如。

代码语言:javascript
复制
function bar(o) {
    var f = function() { return "Hello World!"; }
    o.__proto__ = f.__proto__;
    f.__proto__ = o;
    return f;
}

var o = { x: 5 };
var foo = bar(o);
assert(foo() === "Hello World!");
delete foo.x;
assert(foo.x === 5);

我认为那应该能做你想做的事。

这是通过将对象o注入原型链来实现的,但是要注意以下几点:

我不知道IE是否支持well).

  • o.__proto__ = f.__proto__;,甚至有类似的,从一些人的评论来看,这看起来只适用于火狐和基于safari的浏览器(所以camino,chrome等),因为对于function.toString这样的功能原型函数来说,function.toString是真正必要的,所以您可能想跳过它,特别是如果您希望o有一个有意义的原型。
票数 12
EN

Stack Overflow用户

发布于 2009-02-14 09:14:03

--我正在寻找一个具有任意原型链的可调用JavaScript对象,但不需要修改Function.prototype。

我不认为有一种便携式的方法可以做到这一点:

必须设置函数对象的[Prototype]属性,或者向常规对象添加[Call]属性。第一个可以通过非标准的__proto__属性(参见olliej's answer)完成,据我所知,第二个属性是不可能的。

[Prototype]只能在对象创建期间通过构造函数的prototype属性进行可移植设置。不幸的是,据我所知,没有JavaScript实现允许临时重新分配Function.prototype

票数 3
EN

Stack Overflow用户

发布于 2009-02-14 06:05:00

我遇到的最接近的跨浏览器功能是这个(在FF、IE、Crome和Opera中进行了测试):

代码语言:javascript
复制
function create(fun,proto){
    var f=function(){};
    //Copy the object since it is going to be changed.
    for (var x in proto)
        f.prototype[x] = proto[x];
    f.prototype.toString = fun;
    return new f;
}
var fun=function(){return "Hello world";}
var obj={x:5}

var foo=create(fun,obj);
foo.x=8;
alert(foo); //Hello world
alert(foo.x); // 8
delete foo.x;
alert(foo.x); // 5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/548487

复制
相关文章

相似问题

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