# 原型模式
原型模式(Prototype Pattern)是用于創建重復的對象,同時又能保證性能。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。
這種模式是實現了一個原型接口,該接口用于創建當前對象的克隆。當直接創建對象的代價比較大時,則采用這種模式。
> 形象描述 [https://www.cnblogs.com/fengyumeng/p/10646487.html](https://www.cnblogs.com/fengyumeng/p/10646487.html)
## **new** 的過程
```
# 原始
function Person(name) {
this.name = name
}
new Person('張三')
# 普通函數 - 類比過程
objectFactory(Person, '張三')
var objectFactory = function() {
// 從Object.prototype上克隆一個空對象
var obj = new Object()
// 取得外部傳入的構造器,在此是Person
var Constructor = [].shift.call( arguments )
// 指向正確的原型
obj.__proto__ = Constructor.prototype
// 借用構造函數給obj設置屬性
var ret = Constructor.apply(obj, arguments)
return typeof ret === 'object' ? ret : obj
}
````
### `prototype`
**只要創建了一個新函數,就會根據一組特定的規則為該函數創建一個`prototype`屬性**,這個**屬性**指向**函數**的**原型對象**,這個對象被所有實例所共享,存放一些共有屬性或者方法;
```
Person.prototype ----> Person函數的原型對象
```
> 在構造函數中,同一類相同的方法可以直接寫在構造函數里,但這樣每實例化一個對象都會產生一個新的該方法,但其實這個方法都是一樣的,這樣會浪費大量空間,另外,可以將相同的方法寫在構造函數外,這樣雖然解決了空間浪費問題,但在全局作用域設置變量污染了命名空間,也不安全。這時可以將相同的屬性和方法放在原型對象中。
### `Constructor`
`constructor`屬性**不影響**任何JavaScript的內部屬性。
> constructor其實沒有什么用處,只是JavaScript語言設計的歷史遺留物。由于constructor屬性是可以變更的,所以未必真的指向對象的構造函數,只是一個提示。不過,從編程習慣上,我們應該盡量讓對象的constructor指向其構造函數,以維持這個慣例。
原型對象都會自動獲得一個constructor屬性,這個屬性是一個指向prototype屬性所在函數的指針。
```
Person.prototype.constructor -----> Person函數
# 在特定的環境下,constructor也能起到一定作用
var a,b;
(function(){
function A(arg1,arg2) {
this.a = 1
this.b=2
}
A.prototype.log = function () {
console.log(this.a)
}
a = new A()
b = new A()
})()
// 1
a.log()
// 1
b.log()
# 因為A在閉包里,所以現在我們是不能直接訪問A的,那如果我想給類A增加新方法怎么辦?
// a.constructor.prototype 在chrome,firefox中可以通過 a.__proto__ 直接訪問
a.constructor.prototype.log2 = function () {
console.log(this.b)
}
// 2
a.log2()
// 2
b.log2()
```
### `__proto__`
`__proto__`是指向本對象的原型對象的指針。可稱為隱式原型,一個對象的隱式原型指向構造該對象的構造函數的原型,這也保證了實例能夠訪問在構造函數原型中定義的屬性和方法。
```
person.__proto__ --------> Person.prototype
```
## 原型鏈變量查找機制
查找機制是這樣的:**首先會先在實例上面搜索屬性,如果找到了直接返回,否則就繼續去原型上面尋找**。
> 圖解指向

> 原型鏈簡圖

- 版本控制之Git簡介
- Git工作流程
- Git工作區、暫存區、版本庫
- Git 指令匯總
- Git 忽略文件規則 .gitignore
- pull request
- HTTP簡介
- HTTP - Keep-Alive
- HTTP緩存
- XMLHttpRequest
- Fetch
- 跨域
- HTTP 消息頭
- TCP/IP
- TCP首部
- IP首部
- IP 協議
- TCP/IP漫畫
- 前端開發規范
- 前端開發規范整理
- 前端未來規劃
- HTML思維導圖
- CSS思維導圖
- 布局
- position,float,display的關系和優先級
- line-height、height、font-size
- 移動端適配
- JS 對象
- JS 原型模式 - 創建對象
- JS 預編譯
- 探索JS引擎
- ES