1.原型是什麼?
在構造函數建立出來的時候,系統會默認的建立並關聯一個對象,這個對象就是原型,
原型對象默認是空對象
默認的原型對象中會有一個屬性constructor指向該構造函數
原型的做用
原型對象中的成員,能夠被使用和它關聯的構造函數建立出來的全部對象共享
2. 原型對象的使用
1. 使用對象的
動態特性(指對象建立出來之後,爲對象添加新的屬性或方法),爲原型對象添加成員
2. 直接替換原型對象
注意事項:
直接替換原型對象,會致使替換以前建立的對象的原型和替換以後建立的對象的原型不一致3. 原型的使用該注意事項
1.使用對象訪問屬性的時候,會如今對象中查找,若是找到了就直接使用
若是沒有找到,就去原型中查找
2.使用對象設置屬性的時候(
點),
只會在對象自己中查找,不會去原型中查找,若是在對象自己中沒有找到這個屬性則給該對象新增一個屬性,若是在對象中有這個屬性,修改這個屬性
3.若是在原型對象中有引用類型的屬性,那麼使用對象進行修改該屬性內容,則其餘全部跟這個原型對象相關的對象都會受到影響 通常狀況下不會將屬性放到原型對象中
//通常狀況下原型中只會放須要共享的方法
Person.prototype.car = {};
var p = new Person( );
p.car = {}; //這是修改屬性
p.car.brand= ""; //這是修改屬性的內容
4.通常狀況下不會將屬性添加到原型對象中
只會將須要共享的方法,添加到原型對象中
4. __proto__
1.這個屬性不是標準屬性,因此存在通用性問題
2.通常不推薦使用這個屬性
3.調試的時候,可使用這個屬性
4.這個屬性是原型中的屬性(??不是實例的?)
替換原型時候的注意事項:
在新替換的原型中,沒有constructor屬性,會影響三角結構關係的合理性
so,
在新替換的原型中,手動添加constructor屬性,以保證關係的合理性,賦值爲關聯的構造函數。
原型鏈
什麼是原型鏈
每一個構造函數都有原型對象,每一個對象都有構造函數,每一個構造函數的原型對象都是對象,也就有構造函數,而後就造成一個鏈式的結構,咱們稱之爲原型鏈。
經過修改原型鏈的結構,實現繼承的方式就是
原型繼承。
對象和原型的成員關係
```js
function Person(){};
var p = new Person();
```
p對象中包含的成員有:Person.prototype中的成員和自身擁有成員
Person.prototype中的成員有:Object.prototype的成員和自身的成員
p對象能夠訪問Person.prototype和Object.prototype中的全部成員
Object.prototype的成員
* constructor :指向和該原型相關的構造函數
* hasOwnProperty 方法: 判斷對象自己是否擁有某個屬性
* properIsEnumerable 方法: 1.判斷屬性是否屬於對象自己,2.判斷屬性是否能夠被遍歷
* toString toLocaleString: 將對象轉換成字符串 toLocalString轉換成字符串的時候應用的本地的設置格式
* valueOf 方法:在對象參與運算的時候,首先調用valueOf方法獲取對象的值,若是該值沒法參與運算,將會調用toString方法
* __proto__ 屬性: 指向當前對象的原型對象函數
完整原型鏈
1.Function構造函數能夠用Function.__proto__來訪問Function.prototype. 這是由於Function構造函數的構造函數是他自己,做爲實例化對象的角色來訪問,可行。spa
2.任何函數都是函數,他都繼承Function的全部屬性和方法,而Function是內置的構造函數,也是對象,都是繼承Object的全部屬性和方法。prototype