所以这是一些代码是否在所有对象之间共享JavaScript函数?
ob1 = {
m: function(){
alert(this);
}
}
ob2.m = ob1.m;
,这是因为我觉得函数存储一次在内存在这种情况下
所以这是一些代码是否在所有对象之间共享JavaScript函数?
ob1 = {
m: function(){
alert(this);
}
}
ob2.m = ob1.m;
,这是因为我觉得函数存储一次在内存在这种情况下
是,与该代码,既ob1
和ob2
具有到相同功能m
的参考。如果您拨打ob1.m()
,它将拨打m
与this
参考ob1
。如果您拨打obj2.m()
,它将拨打m
与this
参考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
功能。
的对象,所以函数一次存储在内存中? – 2013-02-18 14:06:08
@AbdulRaziq:正确,就像任何其他物体一样。 – 2013-02-18 14:07:01
感谢T.J现在清楚 – 2013-02-18 14:12:16
是。函数是第一类对象。你只有真正与它们的引用交互。
在你的例子中,你只需要在ob2中存储一个到函数m的链接。
要使函数成为全局函数,需要设置对象原型。我不建议这样做,但这应该工作:
Object.prototype.test=1;
{test} --> 1
Object.prototype与这个问题没有任何关系(或者确实使函数成为“全局”)。 – 2013-02-18 14:10:23
你的问题是什么?什么是'ob2'? – jbabey 2013-02-18 14:01:54
我只想知道iam是否正确思考?没有进一步的解释 – 2013-02-18 14:01:54
ob2是第二个参考ob1m方法 – 2013-02-18 14:02:49