2013-02-18 100 views
0

所以这是一些代码是否在所有对象之间共享JavaScript函数?

ob1 = { 
m: function(){ 
    alert(this); 
    } 
} 

ob2.m = ob1.m; 

,这是因为我觉得函数存储一次在内存在这种情况下

+1

你的问题是什么?什么是'ob2'? – jbabey 2013-02-18 14:01:54

+0

我只想知道iam是否正确思考?没有进一步的解释 – 2013-02-18 14:01:54

+0

ob2是第二个参考ob1m方法 – 2013-02-18 14:02:49

回答

1

是,与该代码,既ob1ob2具有到相同功能m的参考。如果您拨打ob1.m(),它将拨打mthis参考ob1。如果您拨打obj2.m(),它将拨打mthis参考ob2。只有一个函数的副本,并且您有多个参考到那个函数。在JavaScript中,函数是真实的对象,就像任何其他对象一样。 (这不是许多其他编程语言的真实。)

你也可以这样做:

function m() { 
} 

var ob1 = {m: m}; 
var ob2 = {m: m}; 

再次它们共享的功能。

或者这样:

function MyObject() { 
} 
MyObject.prototype.m = function() { 
}; 

var ob1 = new MyObject(); 
var ob2 = new MyObject(); 

他们再次共享功能,因为它们都收到MyObject.prototype其基础原型他们通过new MyObject创建时,与原型具有对函数的引用。

同样(在启用ES5-环境):

var MyProto = { 
    m: function() { 
    } 
}; 

var ob1 = Object.create(MyProto); 
var ob2 = Object.create(MyProto); 

对象再次最终共享的原型,并且原型具有m功能。

+0

的对象,所以函数一次存储在内存中? – 2013-02-18 14:06:08

+0

@AbdulRaziq:正确,就像任何其他物体一样。 – 2013-02-18 14:07:01

+0

感谢T.J现在清楚 – 2013-02-18 14:12:16

0

是。函数是第一类对象。你只有真正与它们的引用交互。

0

在你的例子中,你只需要在ob2中存储一个到函数m的链接。

要使函数成为全局函数,需要设置对象原型。我不建议这样做,但这应该工作:

Object.prototype.test=1; 
{test} --> 1 
+1

Object.prototype与这个问题没有任何关系(或者确实使函数成为“全局”)。 – 2013-02-18 14:10:23