理解對象
首先對象的定義是:「無序屬性的集合,其屬性能夠包含基本值、對象或者函數。」嚴格來說,
這就至關於說對象是一組沒有特定順序的值。對象的每一個屬性或方法都有一個名字,而每一個名字都映射到一個值。正由於這樣(以及其餘將要討論的緣由),咱們能夠把 ECMAScript 的對象想象成散列表:無非就是一組名值對,其中值能夠是數據或函數。
原型對象理解
1.建立的每一個函數都有一個 prototype(原型)屬性,這個屬性是一個指針,指向一個對象(原型對象), 而原型對象的用途是包含能夠由特定類型的全部實例共享的屬性和方法。函數
2.建立一個新函數,會根據一組特定的規則爲該函數建立一個 prototype 屬性(原型屬性),這個屬性指向函數的原型對象。在默認狀況下,全部原型對象都會自動得到一個 constructor (構造函數屬性)屬性,這個屬性包含一個指向 prototype 屬性所在函數的指針。就拿前面的例子來講, Person.prototype.constructor 指向 Person。而經過這個構造函數,咱們還可繼續爲原型對象添加其餘屬性和方法測試
3.當調用構造函數建立一個新實例後,該實例的內部將包含一個指針(內部 屬性),指向構造函數的原型對象。ECMA-262 第 5 版中管這個指針叫[[Prototype]]。雖然在腳本中 沒有標準的方式訪問[[Prototype]],但 Firefox、Safari 和 Chrome 在每一個對象上都支持一個屬性 proto;而在其餘實現中,這個屬性對腳本則是徹底不可見的。不過,要明確的真正重要的一點就 是,這個鏈接存在於實例與構造函數的原型對象之間,而不是存在於實例與構造函數之間。Person 的每一個實例—— person1 和 person2 都包含一個內部屬性,該屬性僅僅指向了 Person.prototype;換句話說,它們 與構造函數沒有直接的關係。spa
4.實現中都沒法訪問到[[Prototype]],.net
1>但能夠經過 isPrototypeOf()方法來肯定對象之間是否存在這種關係。
2>ECMAScript 5增長了一個新方法,叫Object.getPrototypeOf(),在全部支持的實現中,這個方法返回[[Prototype]]的值。例如:
理解prototype、__proto__與constructorprototype
1>__proto__和constructor屬性是對象所獨有的;prototype屬性是函數所獨有的,由於函數也是一種對象,因此函數也擁有__proto__和constructor屬性。 2>__proto__屬性的做用就是當訪問一個對象的屬性時,若是該對象內部不存在這個屬性,那麼就會去它的__proto__屬性所指向的那個對象(父對象)裏找,一直找,直到__proto__屬性的終點**null**,而後返回undefined,再往上找就至關於在null上取值,會報錯。經過__proto__屬性將對象鏈接起來的這條鏈路即咱們所謂的**原型鏈**。 3>prototype屬性的做用就是讓該函數所**實例化的對象**們均可以找到公用的屬性和方法,即f1.__proto__ === Foo.prototype。 4>constructor屬性的含義就是指向該**對象的構造函數**,全部函數(此時當作對象了)最終的構造函數都指向Function。
原型鏈
原型鏈是實現繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承另外一個引用類型的屬性和方法。
(構造函數)的prototype屬性指向(原型對象);
(原型對象)的constructor屬性指向(構造函數);
(實例對象)的[[Prototype]]/__proto__指向(原型對象)指針
1.全部引用類型默認都繼承了 Object,而 這個繼承也是經過原型鏈實現的。你們要記住,全部函數的默認原型都是 Object 的實例,所以默認原 型都會包含一個內部指針,指向 Object.prototype。這也正是全部自定義類型都會繼承 toString()、 valueOf()等默認方法的根本緣由。因此,咱們說上面例子展現的原型鏈中還應該包括另一個繼承層次code
能夠經過兩種方式來肯定原型和實例之間的關係。第一種方式是使用 instanceof 操做符,只要用 這個操做符來測試實例與原型鏈中出現過的構造函數,結果就會返回 true。如下幾行代碼就說明了這 一點。對象
因爲原型鏈的關係,咱們能夠說 instance 是 Object、SuperType 或 SubType 中任何一個類型 的實例。所以,測試這三個構造函數的結果都返回了 true。
第二種方式是使用 isPrototypeOf()方法。一樣,只要是原型鏈中出現過的原型,均可以說是該 原型鏈所派生的實例的原型,所以 isPrototypeOf()方法也會返回 true,以下所示。blog
參考文章繼承