2014-01-07 64 views
1

我目前正在學習使用javascript進行原型設計,我在下面寫道,當我使用它時它似乎工作正常。我的問題是爲什麼我需要()在原型聲明的末尾,沒有,如果我試圖讓對象的實例,我得到一個錯誤。javascript原型如何創建對象

var MyTest = function (agencyId, dataId) { 
this.agencyId= agencyId; 
this.dataId= dataId; 
}; 

MyTest.prototype = function() { 
    var setObservables = function() { 
     ... 
    }, 
    init = function (url) { 
     ... 
    }; 

    // public members 
    return { 
     init: init 
    }; 
}(); 

使用它,我這樣稱呼它

  var obj = new DetailsDivisionKO(1, 2); 
     obj.init(actionUrl); 

這工作得很好,但我搞不清}();在公共成員部分的末尾,爲什麼需要這樣做,我不能這樣做,仍然使用上面的代碼來調用它?作爲一個沒有,如果我嘗試調用上面的代碼我得到一個錯誤,指出:

Uncaught TypeError: Object [object Object] has no method 'init' 
+3

原型需要有一個_Object_的'()'被調用_function表情的,因此_Object_是'return'ed –

+2

您正在創建一個函數,然後立即調用它。這是爲了創建一個新的範圍。 –

回答

4

你有什麼是IIFE。它是一個亞式的調用函數。您基本上正在創建一個closure。你正在公開你的init函數,同時保留一個真正的私人範圍到你的setObservables函數。所以每次創建構造函數的新實例時,init函數都將始終處於原型中。但setObservables不會。在你的例子中,你只能在內部訪問setObservables函數(因此私有作用域)。通常你會這樣做,如果你只想要你的init函數調用你的私有函數,你的情況是setObservables。但是,如果這是不是你想要的,你只要能做到這一點:

var MyTest = function (agencyId, dataId) { 
    this.agencyId= agencyId; 
    this.dataId= dataId; 
    }; 

    MyTest.prototype = { 
    setObservables: function() { 
     ... 
    }, 
    init: function (url) { 
     ... 
    } 
    } 

現在每次您將創建MyTest的新實例,您的兩個功能會在它的原型。

var test = new MyTest(1, 2); 
test.init(); 
test.setObservables();