## javascript 三座大山
這個標題其實我自己總結的,目前網絡上沒有相關的說法。意思就是javascript中比較重要難懂的三點知識。熟練掌握了這三點,你的javascript的基本功才算是過關。否則,你去BAT這種公司去面試前端,估計是過不了關。
- **原型和原型鏈**
- **上下文環境和作用域**
- **單線程和異步**
以上這『三座大山』我希望能找機會跟大家單獨分享,此處只講第一個的一部分,即講到你能看懂后面zepto的設計,就夠了。
<br>
## `Array.prototype`
先記住一句話——**每一個函數,都有一個`prototype`屬性**——每一個函數,無論是你自定義的,還是系統內置的。不信可以試試。
```js
var fn = function() {}
console.log( fn.prototype );
```
這里打印出來的`fn.prototype`是一個對象,只有一個`constructor`屬性,指向該函數自身,即`fn.prototype.constructor === fn`。

以上是自定義的函數,數組構造函數`Array`也是一個函數,只不過是瀏覽器內置的函數,它也得符合以上那句話。
```js
console.log( typeof Array ); // 'function'
console.log( Array.prototype );
```
這里打印出來的`Array.prototype`也是一個對象,也有一個`constructor`屬性,指向該函數自身。只不過還內置了其他的屬性——廢話,內置的對象毛用沒有還內置個卵勁啊。

<br>
## `[].__proto__`
然后,再記住一句話——**所有通過函數`new`出來的東西,這個東西都有一個`__proto__`指向這個函數的`prototype`**,這里我們給他們分別取一個中文名字:
- `prototype` (顯示)原型
- `__proto__` 隱式原型
```js
var arr = []; // 等價于 var arr = new Array()
arr.__proto__ === Array.prototype; // true
```

然后,再記住一句話——**當你想要使用一個對象(或者一個數組)的某個功能時:如果該對象本身具有這個功能,則直接使用;如果該對象本身沒有這個功能,則去`__proto__`中找**
```js
var obj = {
fn1: function () {
console.log('fn1');
}
};
obj.fn1(); // 'fn1'
obj.toString(); // '[object Object]' (在 obj.__proto__ 中找到)
```
數組也一樣
```js
var arr = [];
arr.push(1); // 在 arr.__proto__ 中找到了 push 方法
```
這就是為何數組會有`concat`、`push`等方法,順藤摸瓜最終摸到了`Array.prototype`中來了。
因此,下列代碼是成立的
```js
[].concat === Array.prototype.concat;
[].push === Array.prototype.push;
[].map === Array.prototype.map;
```
<br>
## `__proto__`是可修改的
上一節我們說過,`__proto__`就是一個基本的js對象,根據js無底線的語法規則,它是完全可以被修改或者重寫的。這里不妨就再多嘮叨兩句。

修改`__proto__`的例子。修改了之后,`arr`不僅有內置的`concat`、`push`等功能,還多了一個`addClass`功能。
```js
var arr = [1,2,3];
arr.__proto__.addClass = function () {
console.log(123);
}
arr.push(4);
arr.addClass(); // 123
```
完全重寫 `__proto__` 的例子,上一節講過。還是注意,重寫`__proto__`之后,`arr`可就失去了`concat`、`push`等親人了,只有一個`addClass`功能了。
```js
var arr = [1,2,3];
arr.__proto__ = {
addClass: function () {
console.log(123);
}
};
arr.addClass(); // 123
```
<br>
## 總結
第一,上文中有三句話要記住并且理解;
第二,有了這些基礎知識,再去扒zepto的皮就輕而易舉了;
第三,關于js的原型和原型鏈的知識,真的還有很多話沒有說;
<br>