如何在JavaScript中将"对象"转换为函数?
JavaScript允许将函数视为对象-如果我们首先将变量定义为函数,则可以随后向该函数添加属性。我们如何做相反的操作,并向"对象"添加功能?
这有效:
var foo = function() { return 1; }; foo.baz = "qqqq";
此时,foo()
会调用函数,而foo.baz
的值为" qqqq"。
但是,如果我们首先进行属性分配部分,那么随后如何将函数分配给变量?
var bar = { baz: "qqqq" };
我现在该怎么办才能使bar.baz具有值" qqqq"和bar()来调用该函数?
解决方案
JavaScript allows functions to be treated as objects--you can add a property to a function. How do you do the reverse, and add a function to an object?
我们似乎有些困惑。 JavaScript中的函数是对象。并且变量是变量。我们不会指望它能起作用:
var three = 3; three = 4; assert(three === 3);
...所以我们为什么期望将函数分配给变量会以某种方式保留其先前的值?也许一些注释会为我们澄清一些事情:
// assigns an anonymous function to the variable "foo" var foo = function() { return 1; }; // assigns a string to the property "baz" on the object // referenced by "foo" (which, in this case, happens to be a function) foo.baz = "qqqq";
似乎没有标准的方法可以执行此操作。
但是,为什么呢?
function functionize( obj , func ) { out = func; for( i in obj ){ out[i] = obj[i]; } ; return out; } x = { a: 1, b: 2 }; x = functionize( x , function(){ return "hello world"; } ); x() ==> "hello world"
根本没有其他方法可以做到这一点,
正在做
x={} x()
将返回"类型错误"。因为" x"是一个"对象",我们不能更改它。它和尝试做一样明智
x = 1 x[50] = 5 print x[50]
它不会工作。 1是整数。整数没有数组方法。你做不到。
使用一个临时变量:
var xxx = function()...
然后从原始对象复制所有属性:
for (var p in bar) { xxx[p] = bar[p]; }
最后将具有旧属性的新功能重新分配给原始变量:
bar = xxx;
在这里很容易混淆,但是我们不能(轻松,清晰或者据我所知)做我们想做的事情。希望这将有助于清理问题。
首先,Javascript中的每个对象都继承自Object对象。
//these do the same thing var foo = new Object(); var bar = {};
其次,函数是Javascript中的对象。具体来说,它们是一个Function对象。 Function对象继承自Object对象。检出Function构造函数
var foo = new Function(); var bar = function(){}; function baz(){};
一旦将变量声明为"对象",就不能(轻松,清晰或者据我所知)将其转换为Function对象。我们需要声明一个类型为Function的新Object(具有函数构造函数,为变量分配匿名函数等),然后从旧对象中复制方法的任何属性。
最后,预料到一个可能的问题,即使一旦将某些内容声明为函数,也无法(据我所知)更改functionBody / source。
var bar = { baz: "qqqq", runFunc: function() { return 1; } }; alert(bar.baz); // should produce qqqq alert(bar.runFunc()); // should produce 1
我想我们正在寻找这个。
也可以这样写:
function Bar() { this.baz = "qqqq"; this.runFunc = function() { return 1; } } nBar = new Bar(); alert(nBar.baz); // should produce qqqq alert(nBar.runFunc()); // should produce 1