2012-10-24 13 views
2

我想用Javascript創建一個「Class」工廠,這樣我就可以創建不同類型的對象。如何在新的JavaScript函數中引用自我?

這裏是我使用的功能:

var Class = function(methods) { 
    var klass = function() { 
     var self = this; 
     this.initialize.apply(this, arguments); 
    }; 

    for (var property in methods) { 
     klass.prototype[property] = methods[property]; 
    } 

    if (!klass.prototype.initialize) klass.prototype.initialize = function(){}; 

    return klass;  
}; 

然後,我可以這樣做:

var myObject = Class({ 
    initialize: function() { console.log(self);} 
}); 
var createdObject = new myObject(); 

然而,執行console.log(個體經營)總是指窗口,我d喜歡它來引用對象本身。

我知道這是一個範圍問題,但我很困惑如何創建一個對象的引用?

我想用Javascript創建一個「Class」工廠,這樣我就可以創建不同類型的對象。

這裏是我使用的功能:

var Class = function(methods) { 
var klass = function() { 
    var self = this; 
    this.initialize.apply(this, arguments); 
}; 

for (var property in methods) { 
    klass.prototype[property] = methods[property]; 
} 

if (!klass.prototype.initialize) klass.prototype.initialize = function(){}; 

return klass;  

};

然後,我可以這樣做:

var myObject = Class({ 
    initialize: function() { console.log(self);} 
}); 
var createdObject = new myObject(); 

然而,執行console.log(個體經營)總是指窗口,我想它是指對象本身。

我知道這是一個範圍問題,但我很困惑如何創建一個對象的引用?

例如,如果我想要做的:

var myObject = Class({ 
    initialize: function() { 
     $('#myDiv').click(function() { 
      self.anotherFunction(); 
     }); 
    }, 

    anotherFunction: function() { 
     alert('hi'); 
    } 
}); 

我需要能夠與自我引用「myObject的」 ......

+1

嘗試'this',而不是'self'? –

+0

'self'指向全局對象,至少在webkit中。 – dfsq

+0

沒錯......那麼我如何指向當前的對象呢? – johnnietheblack

回答

3

使用this而不是self。自我將無法訪問initialize函數,因爲它被定義在klass self範圍之外

最佳選項是在每個函數內定義self作爲我提供的最後解決方案。

var myObject = Class({ 
    initialize: function() { console.log(this);} 
}); 

OR

var myObject = Class({ 
     initialize: function() { console.log(createdObject);} 
    }); 

OR

var myObject = Class({ 
      initialize: function() { var self = this; console.log(self);} 
     }); 
+1

這很酷,但我需要在某處保存對「this」的引用,以便我可以在較窄範圍內的對象內使用它...例如在jquery函數中或其他東西... – johnnietheblack

+0

createdObject與您的自我相同。所以不要使用自用createdObject。 – Anoop

+1

可以說我們爲初始化函數添加了另一個外殼,如initialize:function(){$('#myDiv')。click(function(){self.anotherFunction();}); } – johnnietheblack

相關問題