JavaScript原型和原型鏈

做用域鏈與原型鏈的區別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沒有原型,是原型鏈中的最後一個環節。

面試題:什麼是原型鏈?

Javascript是面向對象的,每一個實例對象都有一個 proto屬性,該屬性指向它原型對象,這個實例對象的構造函數有一個原型屬性prototype,與實例的 proto屬性指向同一個對象。當一個對象在查找一個屬性的時候,自身沒有就會根據 proto像它的原型進行查找,若是都沒有,則向它的原型的原型繼續查找,直到查到object.prototype. proto爲null,這樣也就造成了原型鏈。
 
 
 
 
面試題
1. javascript中,有幾種數據類型?
2.怎麼去判斷這些數據類型?
3.typeof能夠返回幾種值?
 六種:number string boolean undefined object function
 typeof null
 typeof array
 typeof object
 怎麼去區分這三個object?
 Object.prototype.toString.call()
相關文章
相關標籤/搜索