JavaScript原型與原型鏈

一、數(shù)據(jù)類型
JavaScript的數(shù)據(jù)類型可以分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。

  1. 基本數(shù)據(jù)類型(6種)
    • String
    • Number
    • Boolean
    • null
    • undefined
    • Symbol(ES6)
  2. 引用數(shù)據(jù)類型
    • Object

二、面向?qū)ο缶幊?/strong>


  1. 構造函數(shù)
    • 面向?qū)ο缶幊痰牡谝徊?,就是要生成對象。前面說過,對象是單個實物的抽象。通常需要一個模板,表示某一類實物的共同特征,然后對象根據(jù)這個模板生成。
    • JavaScript 語言使用構造函數(shù)(constructor)作為對象的模板。所謂”構造函數(shù)”,就是專門用來生成實例對象的函數(shù)。它就是對象的模板,描述實例對象的基本結構。一個構造函數(shù),可以生成多個實例對象,這些實例對象都有相同的結構。
    • 構造函數(shù)就是一個普通的函數(shù),為了與普通函數(shù)區(qū)別,構造函數(shù)名字的第一個字母通常大寫。

    構造函數(shù)的特點有兩個。

    • 函數(shù)體內(nèi)部使用了this關鍵字,代表了所要生成的對象實例。
    • 使用new命令生成對象。

2. new命令
new命令的作用,就是執(zhí)行構造函數(shù),返回一個實例對象。

new 命令的原理

  1. 創(chuàng)建一個空對象,作為將要返回的對象實例。
  2. 將這個空對象的原型,指向構造函數(shù)的prototype屬性。
  3. 將這個空對象賦值給函數(shù)內(nèi)部的this關鍵字。
  4. 開始執(zhí)行構造函數(shù)內(nèi)部的代碼。

如果構造函數(shù)內(nèi)部有return語句,而且return后面跟著一個對象,new命令會返回return語句指定的對象;否則,返回this對象。

var Fn=function(){
    this.name='xxx';
    this.old=18;
}
var f1=new Fn();
console.log(f1.name);//xxx
console.log(f1.old);//18

上面代碼通過new命令,讓構造函數(shù)Fn生成一個實例對象,保存在變量f1中。這個新生成的實例對象,從構造函數(shù)Fn得到了name和old屬性。new命令執(zhí)行時,構造函數(shù)內(nèi)部的this,就代表了新生成的實例對象,this.name和this.old是實例對象的屬性。

var Fn2=function(){
    name='xxx';
    old=18;
}
var f2=new Fn2();
console.log(f2.name);//undefined
console.log(f2.old);//undefined
f2.name='yyy';
console.log(f2.name);//yyy

三、原型與原型鏈

對象是函數(shù)創(chuàng)建的,而函數(shù)卻又是一種對象。也是屬性的集合,可以對函數(shù)進行自定義屬性。
每個函數(shù)都有一個屬性叫做prototype。
這個prototype的屬性值是一個對象,默認的只有一個叫做constructor的屬性,指向這個函數(shù)本身。

var Fn=function(){
    this.name='xxx';
    this.old=18;
}
383c2593-d64d-4f43-b513-1ad8c252aa29.png

回到上面new命令的原理的第二條,從這張圖可以看到對象的原型,指向構造函數(shù)的prototype屬性。

f1.__proto__指向構造函數(shù)的prototype屬性,就是對象的原型。所以f1.__proto__===Fn.prototype為true

prototype的屬性值是一個對象,默認的只有一個叫做constructor的屬性,指向這個函數(shù)本身。

  • 029084da-917f-40e5-bea7-393ec5993b63.png

左邊為Fn函數(shù),右邊就是它的原型

在上面可以看到f1.__proto__===Fn.prototype的結果為true
__proto__就是指向構造函數(shù)的prototype屬性,Fn.prototype就是對象的原型

即,每個由構造函數(shù)創(chuàng)建的對象都有一個proto屬性,指向創(chuàng)建該對象的函數(shù)的prototype。

基于以上,我們得到一個重要的公式
var 對象名 = new 函數(shù)名()
對象名.__proto__=== 函數(shù)名.prototype

小結

  1. 自定義函數(shù).__proto__指向Function.prototype

  2. Object.__proto__指向Function.prototypeObject.__proto__ === Function.prototype//true

  3. Function.__proto__指向Function.prototype:Function也是一個函數(shù),函數(shù)是一種對象,也有__proto__屬性。既然是函數(shù),那么它一定是被Function創(chuàng)建。所以Function是被自身創(chuàng)建的。所以它的__proto__指向了自身的Prototype。

  4. Function.prototype.__proto__===Object.prototype//true

  5. Object.prototype的__proto__指向的是null

總結

  1. 對象是函數(shù)創(chuàng)建的,而函數(shù)卻又是一種對象。也是屬性的集合
  2. 每個函數(shù)都有一個屬性叫做prototype。
  3. 對象的原型,指向構造函數(shù)的prototype屬性。
  4. prototype的屬性值是一個對象,默認的只有一個叫做constructor的屬性,指向這個函數(shù)本身。
  5. 原型既然作為對象,屬性的集合,可以自定義的增加許多屬性。

總之記住下面這幾個要點

  1. Object對象是由Function函數(shù)創(chuàng)建的
  2. 所有函數(shù)都是由Function創(chuàng)建的,函數(shù)也是對象
  3. 重要的公式
    • var 對象名 = new 函數(shù)名()
    • 對象名.__proto__=== 函數(shù)名.prototype
  4. 普通函數(shù)的prototype屬性值是一個對象
  5. Function.prototype有__proto__這個屬性
  6. Object.prototype.__proto__===null結果為true
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容