javascript對象和原型鏈

javascript對象和原型鏈

  • javascript數據類型

ECMAScirpt 有兩種不同的數據類型:基本類型,引用類型。也有其他的叫法,比如原始類型和對象類型、擁有方法的類型和不能擁有方法的類型、可變類型和不可變類型,其實這些叫法都是依據這兩種的類型特點來命名的。

  1. 基本類型:字符串(string)、數字(number)、布爾(boolean)、Null(null)、Undefined(undefined)。
  2. 引用類型:javascript中除了上面的基本類型之外就是引用類型了,也可以說是就是對象了。對象是屬性和方法的集合。
  • 創建對象的方式:
1. var someThing = new Object();
2. var anotherThing = {};

第一種方法和在其它面向對象的語言中使用某個類的構造函數創建一個對象是一模一樣的。第二種方法是使用對象字面量來定義一個對象更簡潔。

  • 原型鏈

和其它的面向對象編程語言不同, javascript 不是基于類的代碼復用體系,它選擇了一種很奇特的基于原型的代碼復用機制。

通俗點說,如果想創建很多對象,而這些對象有某些相同的屬性和行為,為每一個對象編寫單獨的代碼肯定是不合算的。在其它的面向對象編程語言中,可以先設計一個類,然后再以這個類為模板來創建對象。

而在javascript中,解決這個問題的方式是把一個對象作為另外一個對象的原型,當訪問一個對象的屬性或方法的時候,先在對象本身中查找,如果找不到,則到原型中查找,如果還是找不到,則進一步在原型的原型中查找,一直到原型鏈的最末端,擁有相同原型的對象自然擁有了相同的屬性和行為。

  • 原型

javascript中不管以什么方式創建一個對象,它都會自動給你生成一個原型對象,對象中有一個隱藏的proto屬性,它指向這個自動生成的原型對象。而且,自動生成的原型對象也是對象,所以它也有自己的原型對象。

  • 構造函數

在javascript中不管你以什么方式創建一個對象,它最終都是從構造函數生成的,以對象字面量構造的對象也有構造函數,它們分別是Object()和Array()。在定義構造函數的時候,系統自動創建的一個和構造函數相關聯的原型對象,構造函數的prototype屬性指向那個自動創建的原型對象。javascript 中還內置了Object()、Array()、String()、Number()、Boolean()、Function()這一系列的構造函數。

因為構造函數也是對象,所以構造函數既有prototype屬性,又有proto屬性。proptotype屬性指向和構造函數相關聯的原型對象,而proto才是構造函數的原型對象。

  • 原型鏈分析

先考察對象someThing,哪怕它是以對象字面量的方式創建的,它也是從構造函數Object()構造出來的。這時對象someThing的proto屬性也指向與構造函數Object()相關聯的原型對象,即Object.prototype指向的對象。也就是說,構造函數Object()的prototype屬性和對象someThing的proto屬性指向的是同一個原型對象。而且,這個原型對象Object.prototype中有一個constructor屬性,它又指回了構造函數Object(),這樣形成了一個環形的連接。

然后考察構造函數,構造函數首先是函數,函數在javascript中也是對象。因為所有的對象都有構造函數,所以函數的構造函數為Function(),根據上面論述的內容那么所有的函數對象的原型對象即為Function.prototype,構造函數也不例外。

16576-20160908200952301-1531409732.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容