原型對(duì)象

理解原型對(duì)象

  • prototype
    只要?jiǎng)?chuàng)建一個(gè)新函數(shù),就會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè)prototype屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象。
  • 原型對(duì)象
    原型對(duì)象包含可以由(自定義的引用類型對(duì)象的所有實(shí)例對(duì)象)共享的屬性和方法。
  • constructor
    在默認(rèn)情況下,所有原型對(duì)象都會(huì)自動(dòng)獲得一個(gè)constructor屬性,這個(gè)屬性是一個(gè)指向prototype屬性所在函數(shù)的指針。
  • [[prototype]]
    • 當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)新實(shí)例后,該實(shí)例的內(nèi)部將包含一個(gè)指針(內(nèi)部屬性),指向構(gòu)造函數(shù)的原型對(duì)象。
    • [[prototype]]存在于實(shí)例和構(gòu)造函數(shù)的原型對(duì)象之間。
關(guān)系圖-1
  • isPrototypeOf()
    如果調(diào)用isPrototypeOf()方法的對(duì)象就是[[prototype]]指向的對(duì)象,這個(gè)方法就返回true。

  • Object.getPrototypeOf()
    返回[[prototype]]的值。

  • 當(dāng)為對(duì)象實(shí)例添加一個(gè)屬性時(shí),這個(gè)屬性就會(huì)屏蔽原型對(duì)象中保存的同名屬性。

  • hasOwnProperty()
    如果屬性存在于實(shí)例中,返回true

原型與in操作符

  • 單獨(dú)使用
    無論屬性存在于實(shí)例中還是原型中,in操作符通過對(duì)象能夠訪問到該屬性,返回true。
  • for-in循環(huán)中使用
    返回所有
    • 能通過對(duì)象訪問的
    • 可枚舉的(enumberated)屬性,其中既包括存在于實(shí)例中的屬性,也包括存在于原型中的屬性。
    • 屏蔽了原型中不可枚舉屬性的實(shí)例屬性,因?yàn)樗虚_發(fā)人員定義的屬性都是可枚舉的。
  • Object.keys()
    接收一個(gè)對(duì)象作為參數(shù),返回一個(gè)包含所有可枚舉屬性的字符串?dāng)?shù)組。
  • Object.getOwnPropertyNames()
    返回所有實(shí)例屬性。

更簡單的原型語法

為減少不必要的輸入,也為了從視覺上更好的封裝原型的功能,用一個(gè)包含所有屬性和方法的對(duì)象字面量來重寫整個(gè)原型對(duì)象。

  • 弊端
    將導(dǎo)致constructor不再指向構(gòu)造函數(shù),而是指向了Object
    使用Object.defineProperty()重設(shè)構(gòu)造函數(shù),只適用于ECMAScript 5兼容的瀏覽器。

原型的動(dòng)態(tài)性

對(duì)原型對(duì)象所做的任何修改都能夠立即從實(shí)例上反映出來,即時(shí)先創(chuàng)建了實(shí)例后修改原型也如此。

  • 原因:
    實(shí)例與原型之間的松散連接關(guān)系。實(shí)例和原型對(duì)象之間的連接是指針,而非副本,通過指針在原型中搜索。
  • 缺陷:
    重寫整個(gè)原型對(duì)象,相當(dāng)于給構(gòu)造函數(shù)的的prototype指針指向了另一個(gè)原型對(duì)象。
關(guān)系圖-2

原生對(duì)象的原型

除了自定義類型之外,原生的引用類型(Object、Array、String,等等)都在其構(gòu)造函數(shù)的原型上定義了方法。
不建議在產(chǎn)品化的程序中修改原生對(duì)象的原型??赡苤貙憽?/p>

原型對(duì)象的問題

  • 省略了為構(gòu)造函數(shù)傳遞初始化參數(shù),結(jié)果所有實(shí)例在默認(rèn)情況下都將取得相同的屬性值。
  • 對(duì)于包含引用類型值的屬性,在一個(gè)實(shí)例中添加同名屬性,無法屏蔽原型中的屬性值,而是直接修改了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 理解原型對(duì)象 無論什么時(shí)候,只要?jiǎng)?chuàng)建了一個(gè)新函數(shù),就會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè)prototype屬性,這...
    jayafs閱讀 505評(píng)論 0 50
  • 由于JavaScript(ES5)缺乏類,但可用構(gòu)造函數(shù)和原型對(duì)象給對(duì)象帶來與類相似的功能。 4.1 構(gòu)造函數(shù) 構(gòu)...
    不系流年系乾坤閱讀 321評(píng)論 0 0
  • 無論什么時(shí)候,只要?jiǎng)?chuàng)建了一個(gè)新函數(shù),就會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè)prototype屬性,這個(gè)屬性指向函數(shù)...
    frankisbaby閱讀 341評(píng)論 0 0
  • 0 1 今天下班回家時(shí),在小區(qū)門口的水果店拿快遞。因小區(qū)不允許快遞員進(jìn)入,門口水果店代收快遞,一元一個(gè)包裹,生意挺...
    Cynthia采采閱讀 225評(píng)論 2 6
  • 文/蕭讓聽雪 有些人即使在認(rèn)識(shí)數(shù)年之后都是陌生的,彼此之間總似有一種隔膜存在,仿佛盛開在彼岸的花朵,遙遙相對(duì),不可...
    蕭讓聽雪閱讀 590評(píng)論 0 2

友情鏈接更多精彩內(nèi)容