prototype和__proto__直觀區別

真正的prototype與__proto__的區別,在於prototype原始類設計者,也就是說,原始類設計人員須要對prototype進行一系列操做,而__proto__則是二次開發人員,好比我var app = new Vue(),我想要爲Vue實例添加一個方法,就要用app.__proto__,而app.prototype只有尤雨溪纔有權限去修改。html

顯式原型:prototype

隱式原型:__proto__前端

能夠形象地抽象成2類人:git

prototype:小白,個性張揚,飛揚跋扈,大張旗鼓,作事生怕天下人都不知道。

__proto__:老鳥,個性沉穩,深藏功名,暗度陳倉,作事最親近的人都不告訴。
至於爲何,看了下文就能略知一二!github

其實從字面意思就能夠看出二者區別。segmentfault

顯式: 明顯的,表現出來的,顯示出來的,當前文件中肉眼能夠看見的
隱式: 隱藏的,沒有表現出來的,隱藏起來的,當前文件中肉眼看不到的
原型:原型是Javascript繼承中的核心,經過對原型鏈從最上層向最下層進行查找,來實現方法的調用。
寫一個我最近遇到的例子來直觀的理解:

html文件中的script:微信

var myProgressOne = new mProgress();
        var myClickCallback = function(params){
            console.log(params);
        }

建立新mProgress類須要的script:前端工程師

var mProgress = function(){
        
        };
        mProgress.prototype = $.extend( new MCBASE(), {
                version:'0.0.1',
                template :'<div class="pg-group">' +
        
                        '</div>',
                defaultOption : {
                    'colors':[],
                    'data': [],
                },
              setDom: function( dom ){
                    this.wrap = this._setDom( dom );
                    if( !this.wrap ){
                        console.log('配置項缺失');
                        return false;
                    }
                },
              ...
         }

定義mProgress類時繼承的類的script:數據結構

var MCBASE = function(){
           this.version = '0.0.1';
       };
       
       MCBASE.prototype = {
           _getMod : function( ){
               return this;
           },
           _setDom : function(  dom ){
               if( !dom || !dom.length ){
                   console.log('配置項缺失');
                   return null;
               }
           },
           _formateLargeData : function( largeData, fixed ){
           
           }
           ...
        };

此時的對象數據結構見下圖,能夠直觀觀察出prototype和__proto__的區別:
小白和老鳥,或者叫孫子和爺爺也能夠。app

clipboard.png

期待和你們交流,共同進步,歡迎你們加入我建立的與前端開發密切相關的技術討論小組:dom

努力成爲優秀前端工程師!

相關文章
相關標籤/搜索