JavaScript 原型

prototype

在ES2019中 對於prototype的定義爲瀏覽器

給其它對象提供共享屬性的對象markdown

看完後 忽然想到了一句話 Vue中一切組件繼承自Vue的原型app

這也解釋了爲何在每一個組件中均可以直接使用Vue的一些方法 由於這些方法被寫在了Vue的原型上ide

原型對象被建立時,會自動生成一個 constructor 屬性,指向建立它的構造函數函數

構造函數的prototype指向原型對象性能

實例對象的__proto__指向原型對象ui

(注)若是在MDN上查閱__proto__這一屬性 你能夠看到lua

已廢棄 該特性已經從 Web 標準中刪除,雖然一些瀏覽器目前仍然支持它,但也許會在將來的某個時間中止支持,請儘可能不要使用該特性。url

警告: 經過現代瀏覽器的操做屬性的便利性,能夠改變一個對象的 [[Prototype]] 屬性, 這種行爲在每個JavaScript引擎和瀏覽器中都是一個很是慢且影響性能的操做,使用這種方式來改變和繼承屬性是對性能影響很是嚴重的,而且性能消耗的時間也不是簡單的花費在 obj.proto = ... 語句上, 它還會影響到全部繼承來自該 [[Prototype]] 的對象,若是你關心性能,你就不該該在一個對象中修改它的 [[Prototype]]。相反, 建立一個新的且能夠繼承 [[Prototype]] 的對象,推薦使用 Object.create()。spa

警告: 當Object.prototype.proto 已被大多數瀏覽器廠商所支持的今天,其存在和確切行爲僅在ECMAScript 2015規範中被標準化爲傳統功能,以確保Web瀏覽器的兼容性。爲了更好的支持,建議只使用 Object.getPrototypeOf()。

官網說的很明白 若是還不理解 看完下面原型鏈的做用 你應該就明白了

這一部分 看着比較繞 可是理解後 對咱們仍是頗有幫助的 好比原型鏈的做用

原型鏈的做用: 原型鏈如此的重要的緣由就在於它決定了 JavaScript 中繼承的實現方式。

當咱們訪問一個屬性時,查找機制以下:

  • 訪問對象實例屬性,有則返回,沒有就經過 __proto__ 去它的原型對象查找。

  • 原型對象上找到即返回,找不到,繼續經過原型對象的 __proto__ 查找。

  • 一層一層一直找到 Object.prototype ,若是找到目標屬性即返回,

    找不到就返回 undefined,不會再往下找,由於在往下找 __proto__ 就是 null 了。

因此 若是咱們用Object.prototype.__proto__去操做了Object的原型對象 那麼全部的對象都會受到影響 由於Object是對象的頂級父類 全部的對象都繼承自它們的頂級父類Object

相關文章
相關標籤/搜索