做用域鏈與原型鏈的區別javascript
做用域:css
做用域是針對變量的,好比建立了一個函數,函數裏面又包含了一個函數,那麼如今就有三個做用域java
全局做用域==>函數1做用域==>函數2做用域面試
做用域的特色就是,先在本身的變量範圍中查找,若是找不到,就會沿着做用域往上找。函數
var a = 1; function b(){ var a = 2; function c(){ var a = 3; console.log(a); } c(); } b();
最後打印的結果是3,由於執行函數c( )的時候,它在本身的範圍內找到了變量a,因此就不會繼續往上查找,若是在函數c()中沒有找到則會繼續向上找,一直會找到全局變量a,這個查找的過程叫作做用域鏈。spa
由於函數c是在函數b中建立的,因此函數c能夠在函數b中查找變量a,也就是說函數c的做用域包含了函數b的做用域,固然也包含了全局做用域,可是函數b不能向函數c中查找變量,由於做用域只會向上查找prototype
原型鏈是針對構造函數的,好比先建立一個構造函數,而後經過一個變量new了這個函數,那麼這個被new出來的函數就會繼承建立出來的那個函數的屬性,而後若是訪問new出來的這個函數的某個屬性,可是並無在這個new出來的函數中定義這個變量,那麼它就會(向建立出它的函數中)查找,這個查找的過程叫作原型鏈code
Object==>構造函數1==>構造函數2對象
就像css中的繼承同樣,若是自身沒有定義就會繼承父元素的樣式blog
function a(){}; a.prototype.name = "原型";var b = new a(); console.log(b.name); //原型
原型概念:原型就是一個屬性,這個屬性是構造函數的屬性,是構造函數製造出來的,對象的公共祖先,後面全部對象都會繼承原型的屬性和方法
當談到繼承時,JavaScript只有一種結構:對象。每一個實例對象(object)都有一個私有屬性(__proto__)指向它的構造函數的原型對象(prototype)。該原型對象也有一個本身的原型對象(__proto__),層層向上直到一個對象的原型對象爲null。null沒有原型,是原型鏈中的最後一個環節。
面試題:什麼是原型鏈?