2013-04-09 64 views
2

我一直在使用Revealing模塊模式,並有幾個名稱空間。 實施例:Revealing原型模式中的命名空間對象如何?

// here's the namespace setup 

var myProject= myProject|| {}; 
var myProject.models= myProject.models || {}; 

myProject.models.MyModel= function(){ 
    var someMethod = function(){ 
    // do something 
    }; 
    return{ 
     SomeMethod = someMethod 
    }; 
} 

我移動到Revealing Prototype Pattern獲得一些內存使用情況的改善,所以我可以裝飾對象的另一功能。我如何將它保存在我的myProject.models命名空間中? 這給我的JavaScript錯誤:

var myProject.models.MyModel= function(){ 
    // properties here 
}; 

myProject.models.MyModel.prototype = (function(){ 
    // methods here 
    var someMethod = function(){ 
     // do something 
    }; 
    return{ 
     SomeMethod = someMethod 
    }; 
}()); 
+0

刪除'var'關鍵字!你正在分配給一個屬性,而不是創建一個變量。 – Bergi 2013-04-09 19:31:32

+0

好的,刪除var會運行。我在看他的例子,並認爲var是必需的。 – Aligned 2013-04-11 13:41:04

回答

4

你有不同的語法錯誤。

myProject = window.myProject|| {}; 

myProject.models = myProject.models || {}; 

myProject.models.MyModel = (function() { 
    //declare a constructor function 
    function MyModel() { 
    } 

    //declare a function that will be publicly available on each MyModel instances 
    MyModel.prototype.someFunction = function() { 
     //call the private function from within the public one 
     //note: you have to be careful here since the context object (this) will be 
     //window inside somePrivateFunction 
     somePrivateFunction(); 

     //call the private function and set the context object to the current model instance 
     //somePrivateFunction.call(this);   
    }; 

    //declare a private function 
    function somePrivateFunction() { 
    } 

    return MyModel; //return the model constructor 
})(); 

現在你可以使用你的模型,如:

var m = new myProject.models.MyModel(); 
m.someFunction(); 
+0

我的目標是做一個var x = new myProject.models.MyModel()並傳入一些值,然後再調用x.SomeMethod(); – Aligned 2013-04-09 19:49:24

+0

@Aligned,根據您的意見我已更新我的帖子。 – plalx 2013-04-09 20:22:37

1
var myProject = myProject || {}; 
^^^ 

您使用的是var statement這裏宣佈全球myProject變量(如果還沒有它的話) ,這樣就不會拋出Undefined variable例外。 (你也它初始化一個空的對象,如果它現在已經值)

var myProject.models= myProject.models || {}; 

在這裏,你從上面分配models屬性的對象。 var關鍵字在這裏不合適;刪除它,它會工作。

隨着myProject.models.MyModel = …你做了正確的上部片段和錯誤的第二個;我不確定你試圖使用哪個。揭示原型模式應該看起來像這樣:

var myProject = myProject || {}; 
myProject.models = myProject.models || {}; 
myProject.models.MyModel = (function(){ 
    function MyModel() { 
     // instance properties here 
    } 
    function someMethod(){ 
     // do something 
    } 
    MyModel.prototype.SomeMethod = someMethod; 
    //    ^lowercase that? 
    return MyModel; 
})(); 
+0

原型函數應該在.MyModel(function()?從我的問題的鏈接中,他已經在外面了。我現在開始查看屬性,你可以應該如何使用return {}來公開這些屬性? – Aligned 2013-04-09 19:44:55

+0

它並不是必須的,我更喜歡不覆蓋原始原型對象(例如保留'.constructor'屬性),但也可以將其指定爲對象字面值。 – Bergi 2013-04-09 19:49:55

+0

有趣。 – Aligned 2013-04-09 20:02:33