所以這是一些代碼是否在所有對象之間共享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