1.什麼是原型?javascript
原型是一個對象,其餘對象能夠經過它實現屬性繼承。java
這裏有兩個概念,我第一次看原型這塊的時候濛濛的~~過幾天以後就……gg了……函數
prototype(原型)屬性: 咱們建立的每一個函數都有一個prototype屬性,這個屬性是一個指針,指向一個對象,而這個對象包含能夠有特定類型的全部實例共享的屬性和方法。這個對象就是原型對象。spa
簡化一下,每一個函數都有一個prototype屬性,指向函數的原型對象。prototype
看一段代碼3d
1 function Foo() { 2 } 3 Foo.prototype.name = "奧特曼"; 4 Foo.prototype.take = function() { 5 var ftake = "打" 6 return ftake; 7 } 8 var obj = new Foo();
默認狀況下全部原型對象都會自動得到一個constructor(構造函數)屬性,這個屬性包含一個指向prototype屬性所在函數的指針。在本例中,原型對象Foo.prototype的constructor屬性指向Foo。指針
原型對象的內部還包括一個指針__proto__指向構造函數的原型對象。code
也就是說上例的原型對象是這樣的對象
Foo.prototype { constructor: Foo, __proto__: Object.prototype, name:"奧特曼", take: function() { var ftake = "打" return ftake; } }
此處應該有圖……我去畫一個……blog
我已經盡力了……真的……我想有朝一日成爲大神看見如今寫的畫的這些鬼……我會羞愧吧……湊合看吧。。。
雖然這圖歪七扭八的,可是,仍是能夠看滴,原型鏈就這麼出來啦!!哈哈
2.原型鏈
首先捏,咱們查找屬性來看一看這個例子的原型鏈。
obj.name 找到了奧特曼~~
可是呢,name是obj的屬性嗎???
不是捏~~那麼是怎麼回事呢??
當查找一個對象的屬性時,JavaScript 會向上遍歷原型鏈,直到找到給定名稱的屬性爲止,到查找到達原型鏈的頂部 - 也就是 Object.prototype - 可是仍然沒有找到指定的屬性,就會返回 undefined。
那麼若是我給obj.name賦值呢?
obj有了name屬性了,那麼Foo.name是否也改變了呢??
結果是Foo.name並未改變。咱們發現namet是按着咱們所說的向上查找來獲得結果的,屬性在查找的時候是先查找自身的屬性,若是沒有再查找原型,再沒有,再往上走,一直插到Object的原型上.
咱們給obj.name賦值.obj.name = "小怪獸",實例obj就有了name屬性。全部咱們會在屬性查找時找到obj.name,可是Foo.name也並未改變。
而咱們能夠使用toString().hasOwnProperty()等方法也是從原型鏈向上查找到Object原型上的方法~~
未完待續~~