官术网_书友最值得收藏!

3.5.2 原型對象

每個對象都有一個原型。對象的原型既可以是一個對象,即原型對象,也可以是null值。原型對象又有其自身的原型,因此對象的原型會形成一條原型鏈,原型鏈將終止于null值。原型對象本質上是一個普通對象,用于在不同對象之間共享屬性和方法。對象與其原型之間具有隱含的引用關系,如圖3-7所示。

圖3-7 對象與原型間的引用關系

在圖3-7中,animal、dog和cat均表示對象。dog和cat對象的原型對象均為animal對象;而animal對象的原型為null值。dog和cat與其原型animal之間具有隱含的引用關系,該關系是通過對象的一個內部屬性來維持的,即圖3-7中的“[[Prototype]]”屬性。所謂隱含的引用關系是指,對象的原型不是對象的公共屬性,因此無法通過對象屬性訪問來直接獲取對象的原型。該圖也展示了對象的原型會形成一條原型鏈,例如從dog到animal并終止于null值的虛線就表示了一條原型鏈。

原型能夠用來在不同對象之間共享屬性和方法,JavaScript中的繼承機制也是通過原型來實現的。原型的作用主要體現在查詢對象某個屬性或方法時會沿著原型鏈依次向后搜索,如圖3-8所示。

圖3-8 原型的作用

在訪問dog對象上的color屬性時,先嘗試在dog對象上查找該屬性。若找到color屬性,則返回屬性值;若沒有找到color屬性,則沿著原型鏈在原型對象animal中繼續查找color屬性。此例中,dog對象沒有color屬性而animal對象包含了color屬性,因此最終會返回animal對象上的color屬性值。如果直到原型鏈的盡頭(null值)也沒有找到相應屬性,那么會返回undefined值而不是產生錯誤。

如果對象本身和其原型對象上同時存在要訪問的屬性,那么就會產生遮蔽效果。在這種情況下,當前對象自身定義的屬性擁有最高的優先級,如圖3-9所示。

圖3-9 屬性的遮蔽

此例中,在dog對象和animal對象上都定義了color屬性。在dog對象上讀取color屬性時,dog對象自身定義的color會被優先選用,而原型對象animal上的color屬性會被忽略。

需要注意的是,原型對象在屬性查詢和屬性設置時起到的作用是不對等的。在查詢對象屬性時會考慮對象的原型,但是在設置對象屬性時不會考慮對象的原型,而是直接修改對象本身的屬性值。

主站蜘蛛池模板: 双辽市| 彭泽县| 三亚市| 威海市| 怀来县| 通辽市| 望都县| 固始县| 房山区| 凤凰县| 舒兰市| 西贡区| 蒙山县| 祁连县| 库车县| 松江区| 桐梓县| 临江市| 航空| 邢台市| 垣曲县| 开封县| 广安市| 盐津县| 贺兰县| 澄江县| 芒康县| 和田市| 台中市| 繁峙县| 逊克县| 广灵县| 北京市| 关岭| 赤城县| 夏邑县| 南康市| 海门市| 宝清县| 新竹县| 大丰市|