簡體   English   中英

共享原型方法的實例,用於私有實例變量

[英]Instances sharing prototype methods for use with private instance variables

這個問題一直困擾着我。 這是一個似乎在SO中定期重新出現的問題。

現在我已經設法創建了一個構造函數,試圖管理私有'屬性'只能使用私有存儲從構造函數原型get / set方法設置。 在它的基本形式中它看起來像這樣:

基本構造函數:

function Human(){
   /** set up a property storage **/   
   var storage = {
      name: { val: name || '-', get:true, set:true }
      ,age: { val: (age || '0'), get:true, set:true }
   };
   function get(){
       if (get.caller !== Human.prototype.get &&
           get.caller !== Human.prototype.set ){ return null }
       return storage;
   }
   this._get = get;
}

將get / set原型方法添加到Human

Human.prototype = {
     get: function(prop){
        return this._get()[prop];
     }
    ,set: function(prop, val){
       var storage = this._get();
       /** 
              set functionallity, returning 
              the current object after setting
              see jsfiddle link @ the bottom of
              this question
        **/
       return this;
    }
};
// usage
var pete = new Human('Pete',23);
pete.get('name'); //=> 'Pete'
pete.set('name','Pete Justin');
pete.get('name'); => 'Pete Justin'
// but
pete.name; //=> 'undefined'

我對你的評論很感興趣。 也許我正在思考一個完全錯誤的方向,也許你說這是一個不必要的操作,違反了js的原型性質,它已經在其他地方已經完成(並且更好),或者其他什么。 請告訴我!

我對此有何看法 - 好吧在這里讓我們稱之為 - 模式 :你使用它的原因是簡單地聲明和獲取屬性( this.some = that等等),你贏得的是更好的封裝,實例變量的隱私和對你使用的屬性有一些控制(不確定它是否是正確的術語,但是在OOP世界中,它有時看起來每個人都賦予它自己的術語私有意義)。

無論如何,我已經在這個jsfiddle中烹飪了一個更完整,更有效的Human

  • [ edit1 ]回應評論:拋棄了立即調用函數(iif)
  • [ edit2 ]沒有.caller私有替代.caller ,但仍然能夠使用私有存儲:請參閱此jsfiddle
  • [ edit3 ]也可能拋棄原型
  • [ edit4 ]完成:這是一個真正的原型獲取/設置變體

首先,這個過度設計的解決方案試圖解決什么?

嘗試從原型訪問構造函數局部變量的問題不是問題。 人們要么只需要使用原型並將所有數據存儲在this以獲得較小的速度增益,或者不要抱怨為每個對象創建額外的功能(最小的開銷)。 這是一個常見的誤解,即為每個對象創建額外的功能是昂貴的。


沒有冒犯,但代碼過於設計,復雜,似乎是閱讀或維護的正確痛苦。 我認為這種方法沒有任何優勢? 為什么不讓this._store成為特權函數。

此外,在構造函數中有一個局部函數這一事實意味着您將失去使用為所有對象提供一個函數的原型的優勢。 我也過度設計了一個類似於此的解決方案來“模擬”私有變量,代碼變得一團糟,我不得不放棄它。


至於代碼批評:

.caller是非標准的。 你不能使用它。 這是一個黑客。

this._store = {get:get};

為什么不只是this._store = get

這個

function thisget(prop){
    return storage[prop];
}
return thisget(prop);

應該內聯到

return storage[prop]

暫無
暫無

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

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