2014-10-20 54 views
0

我看到人們在創建javascript對象時採取兩種方法,他們有時會在主對象之外定義原型函數,有時他們會在內部執行它。在對象中定義原型函數具有使用私有變量和函數的優勢,在外部定義它的優點是什麼?在對象內部創建原型方法有什麼缺點?

function something (params) { 
    this.name = params.name; 
    this.color = params.color; 
    _someprivatefunction = function() {}; 
    something.prototype.publicFunction = function() {_someprivatefunction() }; 
} 

至於反對:

function something (params) { 
    this.name = params.name; 
    this.color = params.color; 
    _someprivatefunction = function() {}; 
} 

something.prototype.publicFunction = function() {//can't call the private function here }; 

編輯:在樓下的意見建議,這是第三個選項(但現在這個問題是私有函數斜面訪問的任何私人的構造函數中的變量。)

(function() { 
    function something (params) { 
    this.name = params.name; 
    this.color = params.color; 
    } 

    _someprivatefunction = function() {}; 

    something.prototype.publicFunction = function() {_someprivatefunction() }; 
}()); 
+2

第一個看起來很奇怪的我。每次創建新實例時,都會在原型級別重新定義函數。這個函數只能訪問最後創建的實例的閉包變量(不管你通過哪個實例調用它)。 我在某種程度上錯了嗎? – 2014-10-20 04:25:04

+0

@SteveJorgensen是的,第一個選項可能是由某個人編寫的不知道原型是什麼,並重新定義它,每個實例的創建都是毫無意義的。如果你需要訪問特定於實例的私有變量(特權函數)的功能,jsfriends解決方案(3rd)會更好。 – HMR 2014-10-20 07:13:14

回答

1

我想你知道,你的兩個代碼塊不提供相同的功能。第一個選項允許你調用_someprivatefunction()或其他私有構造函數變量,而你的第二個選項不會。所以,首先你必須決定這是否是一項要求。您的兩個選項不提供相同的功能。

如果你想訪問私有函數,然後是第三個選項如下:

function something (params) { 
    // initialize data members 
    this.name = params.name; 
    this.color = params.color; 

    // initialize private members 
    var aPrivateInstanceVar = 4; 

    // define private function 
    _someprivatefunction = function() { console.log(aPrivateInstanceVar);}; 

    // define public method with access to private members and functions 
    this.publicFunction = function() {_someprivatefunction() }; 
} 

這種新的選項將在技術上的工作與您的第一選擇。但是(這可能只是我的看法),它感覺更乾淨。它在創建時動態地將屬性分配給對象,這比在對象創建時將原子分配給原型更加常見(就像分配給this.namethis.color一樣)。另外,如果我遇到一些其他人寫到的代碼中有第一個構造的未註釋的代碼,我的第一個想法是:「爲什麼不是原型在構造函數之外完成的原型的賦值」甚至可能試圖「修復」它而不知道它需要在那裏。但是,如果我遇到了我提出的結構,它就像一個完全通用的設計模式,並且我不會試圖「修復」代碼(意外地將其破壞)。

2

我認爲第一種方法的缺點是,你正在運行的每個實例化一個新的對象時,原型分配。似乎它會打敗使用原型的目的,因爲它對所創建的每個實例都在對象上工作。

+0

你錯過了原型中的代碼第一塊是調用一個只在構造函數中可用的私有函數,這根本不可能在構造函數之外完成 – jfriend00 2014-10-20 04:46:05

+0

我仍然認爲選項二更可取,它似乎不是一個好的設計選擇來調用原型在構造函數中,爲了達到相同的行爲,我建議你將它包裝在一個自我執行的閉包,但將私有函數移出構造函數,以便它仍然是一個私有函數,但在內部可用於原型調用。 – TGH 2014-10-20 04:50:12

+0

第二個構造不提供與第一個構造相同的功能,因爲只有第一個構造才能訪問構造函數中的其他每個實例私有變量。如果選擇僅在1和2之間,則需要根據需要哪些功能來進行選擇。我在答案中提供了第三個選項,它提供了與構造函數中的私有變量相同的訪問權限,但不以這種方式使用原型(我同意你的看法,這看起來很奇怪,不合適)。 – jfriend00 2014-10-20 05:01:05

相關問題