2013-02-18 103 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