JS-原型及其做用

1、如何理解面向對象

面向對象的語言有一個標誌,即擁有類的概念,它能夠抽象實例對象的公共屬性與方法,基於類能夠建立任意多個實例對象,通常具備封裝、繼承、多態的特性!但JS中對象與純面嚮對象語言中的對象是不一樣的,ECMA標準定義JS中對象:無序屬性的集合,其屬性能夠包含基本值、對象或者函數。能夠簡單理解爲JS的對象是一組無序的值,其中的屬性或方法都有一個名字,根據這個名字能夠訪問相映射的值(值能夠是基本值/對象/方法)。

在類語言中,對象基於模板來建立,首先定義一個類做爲對現實世界的抽象,而後由類來實例化對象;js(ES5)自己是沒有class類型的,可是每一個函數都有一個prototype屬性。prototype指向一個對象,當函數做爲構造函數時,prototype則起到相似class的做用。好比用原型模式建立對象,只須要在構造函數的原型上面定義屬性和方法,那麼全部實例均可以共享原型對象上的屬性和方法,由於他們內部都有一個__proto__屬性,指向了原型對象。函數

2、如何理解原型和原型鏈

咱們建立的每一個函數都有一個prototype屬性,這個屬性是一個指向原型對象指針,原型對象裏包含着全部實例共享的屬性和方法。同時原型對象裏也有一個constructor指回了其對應的構造函數。
每一個對象實例都會在其內部初始化一個__proto__屬性,它是一個指向prototype(原型對象)的指針,當咱們訪問一個對象的屬性時,若是這個對象內部不存在這個屬性,那麼他就會經過__proto__prototype裏找這個屬性,這個prototype又會有本身的__proto__指向本身的原型對象, 因而就這樣一直找下去,造成了原型鏈的概念。prototype

原型鏈實現的是對屬性的查找,一直順着原型鏈查找到Object對象,若是沒查到返回undefined,還有值得注意的一點就是,全部對象裏的__proto__都是對原型對象的一個引用,而不是副本,因此當咱們修改原型時,與之相關的對象也會繼承這一改變。指針

相關文章
相關標籤/搜索