可能重复:
Can a JavaScript object have a prototype chain, but also be a function?
我希望创建一个具有任意原型链的可调用JavaScript对象,但不需要修改Function.prototype。
换言之,必须这样做:
var o = { x: 5 };
var foo = bar(o);
assert(foo() === "Hello World!");
delete foo.x;
assert(foo.x === 5);而不做任何全球性的改变。
发布于 2009-02-14 06:04:18
没有什么可以阻止您向函数添加任意属性,例如。
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有一个有意义的原型。发布于 2009-02-14 09:14:03
--我正在寻找一个具有任意原型链的可调用JavaScript对象,但不需要修改Function.prototype。
我不认为有一种便携式的方法可以做到这一点:
必须设置函数对象的[Prototype]属性,或者向常规对象添加[Call]属性。第一个可以通过非标准的__proto__属性(参见olliej's answer)完成,据我所知,第二个属性是不可能的。
[Prototype]只能在对象创建期间通过构造函数的prototype属性进行可移植设置。不幸的是,据我所知,没有JavaScript实现允许临时重新分配Function.prototype。
发布于 2009-02-14 06:05:00
我遇到的最接近的跨浏览器功能是这个(在FF、IE、Crome和Opera中进行了测试):
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); // 5https://stackoverflow.com/questions/548487
复制相似问题