簡體   English   中英

在對象內部創建原型方法的缺點是什么?

[英]What's the disadvantage of creating prototype methods inside the object?

我已經看到人們在創建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() };
 }());

我認為第一種方法的缺點是每次實例化一個新對象時都在運行原型分配。 似乎它會破壞使用原型的目的,因為它確實對每個創建的實例都在對象上起作用。

我想您知道,您的兩個代碼塊沒有提供相同的功能。 第一個選項允許您調用_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 )。

另外,如果我遇到了一些未注釋的代碼,而其他人在其中寫了您的第一個結構,那么我的第一個想法便是:“哎呀,為什么對原型的賦值一次不在構造函數之外完成”,我什至可能嘗試“修復”它而沒有意識到它必須存在。 但是,如果我遇到了我要提出的結構,那么它將希望是一種完美的通用設計模式,並且不會試圖“修復”代碼(在過程中無意中破壞了代碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM