真正的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
期待和你們交流,共同進步,歡迎你們加入我建立的與前端開發密切相關的技術討論小組:dom
- SegmentFault技術圈:ES新規範語法糖
- SegmentFault專欄:趁你還年輕,作個優秀的前端工程師
- 知乎專欄:趁你還年輕,作個優秀的前端工程師
- Github博客: 趁你還年輕233的我的博客
- 前端開發QQ羣:660634678
- 微信公衆號: 人獸鬼 / excellent_developers
努力成爲優秀前端工程師!